很简单的一个例子:比如赛车,同时启动,如何用多线程编写,我知道的一种方法是让几个线程进入阻塞等待,然后notifyAll,脑子懵的不知道怎么coding了 求指导一下
解决方案 »
- 用jogl写的程序 窗体内容一闪而过只留下背景色(完整的源代码贴出来了)
- 小白java正则表达式遇到问题,求助啊。
- 一个常识问题
- java.lang.NoClassDefFoundError
- java中如何调用存储过程并获得out参数!高分
- Java程序里怎样吃掉回车键?记得c有吃掉回车键的说法。
- 如何显示BLOB,CLOB字段的内容
- 请推荐java多媒体教学资料
- JAVA导出XLSX格式的EXCEL问题,请大神们各显神通,为小弟指点迷津。
- 关于Hibernate 的@TableGenerator疑问, 看不懂这个有什么用?
- 如何获取java程序在运行过程中哪些类或者哪些方法被调用了,或者是调用的关系等
- 跪求判断等腰直角三角形
Thread t1 = getThread("小明");
Thread t2 = getThread("张三");
Thread t3 = getThread("李四");
t1.start();
t2.start();
t3.start();
t1.join();
t2.join();
t3.join();
System.out.println("全部到达终点 比赛结束");
} private static Thread getThread(String name) {
return new Thread(name){
@Override
public void run() {
System.out.println( Thread.currentThread().getName()+" 赛车启动");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" 到达终点");
}
};
}
这种常见的需求可是使用jdk1.5提供的java.util.concurrent 里面的 CyclicBarrier 和 CountDownLatch 工具类实现。CyclicBarrier实现如下:
package concurrentutil;import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;public class CyclicBarrierTest {
public static void main(String[] args) {
CyclicBarrier barrier = new CyclicBarrier(3);
new Thread(()->{
try {
System.out.println("t1 ready");
TimeUnit.SECONDS.sleep(2);
System.out.println("t1 ok");
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("t1 go");
}).start();
new Thread(()->{
try {
System.out.println("t2 ready");
TimeUnit.SECONDS.sleep(1);
System.out.println("t2 ok");
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("t2 go");
}).start();
new Thread(()->{
try {
System.out.println("t3 ready");
TimeUnit.SECONDS.sleep(4);
System.out.println("t3 ok");
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("t3 go");
}).start();
}
}
CountDownLatch实现如下:
package concurrentutil;import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;public class CountDownLatchTest {
public static void main(String[] args) throws InterruptedException {
CountDownLatch count = new CountDownLatch(1);
new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName()+"进入等待...");
count.await();
System.out.println(Thread.currentThread().getName()+"运行完毕");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName()+"进入等待...");
count.await();
System.out.println(Thread.currentThread().getName()+"运行完毕");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
System.out.println(Thread.currentThread().getName()+"线程等待...");
TimeUnit.SECONDS.sleep(3);
count.countDown();
}
}