2

我有两个任务应该一起运行。将数据保存到数据库的第一个任务。以及录制视频的第二个任务。

目前我为每个任务使用一个线程,并同时运行它。

...
Thread insertDb = new Thread(new Runnable() {
            @Override
            public void run() {
                // Insert to Database
                setDataMediaVisit(thumbStr);
                insertVisitRecord();
            }
        });

        Thread capture = new Thread(new Runnable() {
            @Override
            public void run() {
                if (getGraph().getState() == DSCapture.PREVIEW) {
                    getGraph().setCaptureFile("data/"+ CaptureController.getNoMr() +"/videos/"+videoStr, DSFilterInfo.filterInfoForProfile(new File("profiles/demo_profile800x570_WM8_VBR_100.prx")), DSFilterInfo.doNotRender(), true);
                    getGraph().record();
                }

                setData(CaptureController.getNoMr());
            }
        });

        insertDb.start();
        capture.start();
...

上面的代码线程安全吗?我想使用 EDT,但我知道 Java Swing 组件的 EDT。CMIIW

谢谢你。

4

1 回答 1

1

线程安全只是一个问题,您何时希望将在特定线程中运行的对象与另一个线程一起使用。这里不清楚您是否在这 2 个线程中使用共享对象!但是,如果你想使用一些共享对象或者你想从文件或特定的黄油中读写,你可以像这样使用锁定对象:

final Object lock = new Object();

// In thread 1
// TODO: do some process in thread on

synchronized(lock) {
    // TODO: Put the result in somewhere that thread2 want to read it
}


// In thread 2
synchronized(lock) {
    // TODO: get the result from the place that you put in thread 1
}

// TODO: do some process on thread 2 on the data

您应该始终记住,您需要放置尽可能小的同步,因为如果其他线程到达同步部分,它将等到线程 1 完成同步块,它会破坏您的代码的性能

于 2013-09-18T09:06:32.693 回答