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

时间:2011-01-13 02:33:00

标签: java multithreading

我有一个班级Note和一个班级Meeting。类ArrayList中有noteList名为Note的{​​{1}}。创建Meeting对象后,将其注册到noteList

我只想在主类中说明可以同时(或在关闭时间)创建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).

我已经阅读了可以使用wait()notify()notifyAll()的任何地方,但必须在同步方法中使用它们。我的程序中没有同步方法。

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:8)

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

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

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

答案 2 :(得分:1)

他们在同一时间“接近”开始。关键是您的代码未在t1.start()阻止。

您可以通过在run()类的Meeting方法的顶部添加print语句,在t2.start()之后添加另一个打印语句来查看此内容。像这样:

public class Meeting implements Runnable {
    private String name;
    public Meeting(String name) {
        this.name = name;
    }
    public void run() {
        System.out.println(name + " is running");
    }
}

public class Test {
    public static void main(String[] args) {
        Meeting m_1 = new Meeting("meeting 1");
        Meeting m_2 = new Meeting("meeting 2")
        Thread t1 = new Thread(m_1);
        Thread t2 = new Thread(m_2)
        t1.start();
        t2.start();
        System.out.println("this might print first!");
    }
}

// possible output:
> this might print first!
> meeting 1 is running
> meeting 2 is running