如何同时(或在关闭时)启动两个线程

ech*_*cho 5 java multithreading

我有班级Note和班级Meeting.课堂上有一个ArrayList名字.当创建一个对象时,它将被注册.noteListNoteMeetingnoteList

我只想在主类中说明Meeting可以同时(或在关闭时)创建两个对象.我的计划是:

public class Note{
    //some field and method hier
    public void add(Meeting m){
        notes.add(m);
    }
    private  static final List<Entry> notes =
        Collections.synchronizedList(new ArrayList<Entry>());
}

public class Meeting implements Runnable{
    public Meeting(Note note_1,Note note_2,Calendar calendar){
        note_1.add(this);
        note_2.add(this);}
        //some method
    }

    public class Test implements Runnable{
        public static void main(String[] args) {
            Note note_1 = new Note();                
            Note note_2 = new Note();
            Meeting m_1 = new Meeting(note_1,note_2);
            Meeting m_2 = new Meeting(note_2,note_1)
            Thread t1 = new Thread(m_1);
            Thread t2 = new Thread(m_2)
            t1.start();
            t2.start();
        }
        //t1,t2 are two thread and they start one to one(not at the same time).
Run Code Online (Sandbox Code Playgroud)

我看过的任何地方wait(),notify()或者notifyAll()可以使用,但它们必须在synchronized方法中使用.我的程序中没有同步方法.

Thi*_*ilo 15

这就像你要开始两个线程一样接近.

你可以做的更多同步运行方法是让他们在运行方法的顶部等待CountDownLatch.

这样做是为了消除创建和启动Threads(在运行方法执行之前发生的部分)的开销,也可能是一些怪异的调度奇怪.但是,您无法保证实际执行锁存器后代码的并发性.

CountDownLatch latch = new CountDownLatch(2);

Runnable r1 = new Meeting(latch);
Runnable r2 = new Meeting(latch);


// in Meeting

private final CountDownLatch latch;

public void run(){

   latch.countDown();
   latch.await();

   // other code
}
Run Code Online (Sandbox Code Playgroud)


usr*_*ΛΩΝ 8

不幸的是,没有办法启动两个线程在同一时间.

让我更好地解释一下:首先,序列首先用t1执行,t1.Start();然后t2.Start();执行t2.这意味着只有线程t1 线程2 之前被调度,而不是实际启动.这两种方法各占一小部分,因此人类观察者无法看到它们按顺序排列的事实.

更多,Java线程被安排,即.被指派最终被执行.即使你有一个多核CPU,你也不确定1)线程并行运行(其他系统进程可能会干扰)和2)线程都在Start()调用方法之后启动.