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)
不幸的是,没有办法启动两个线程在同一时间.
让我更好地解释一下:首先,序列首先用t1执行,t1.Start();然后t2.Start();执行t2.这意味着只有线程t1 在线程2 之前被调度,而不是实际启动.这两种方法各占一小部分,因此人类观察者无法看到它们按顺序排列的事实.
更多,Java线程被安排,即.被指派最终被执行.即使你有一个多核CPU,你也不确定1)线程并行运行(其他系统进程可能会干扰)和2)线程都在Start()调用方法之后启动.
| 归档时间: |
|
| 查看次数: |
16398 次 |
| 最近记录: |