java编写一个多线程同时运行的代码

FaberChang 2017-10-19 11:42:21
很简单的一个例子:比如赛车,同时启动,如何用多线程编写,我知道的一种方法是让几个线程进入阻塞等待,然后notifyAll,脑子懵的不知道怎么coding了 求指导一下
...全文
869 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
small_to_large 2017-10-25
  • 打赏
  • 举报
回复
楼主描述的情况:几个线程同时准备好了,然后一块运行,类似于跑步比赛,运动员准备好后,大家同时跑。 这种常见的需求可是使用jdk1.5提供的java.util.concurrent 里面的 CyclicBarrierCountDownLatch 工具类实现。 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();
	}
}
FaberChang 2017-10-25
  • 打赏
  • 举报
回复
引用 6 楼 haizeiCSDN_java 的回复:
我觉得应该是这样,只要当前线程执行了run方法,然后调用wait,直到所有线程都调用了run方法,再最后在调用notifyAll,楼主可以考虑一下。
Ok 我试试
qq_35048233 2017-10-21
  • 打赏
  • 举报
回复
同时启动不可能的,总要有先后,即使你挂起阻塞,设置优先级,然后notifyall,也是随机的,不是所有线程都一定的,不用纠结了
FaberChang 2017-10-20
  • 打赏
  • 举报
回复
引用 4 楼 zy1404 的回复:
public static void main(String[] args) throws Exception {
        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()+" 到达终点");
               }
           };
    }
这个我懂,如何用wait和notifyAll呢
  • 打赏
  • 举报
回复
public static void main(String[] args) throws Exception {
        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()+" 到达终点");
               }
           };
    }
FaberChang 2017-10-20
  • 打赏
  • 举报
回复
引用 2 楼 zc881124 的回复:
同时启动和同步不是一个概念吧。
不是,说准确的话同时启动是不可能的,但是可以粗略的认为是同时启动
110成成 2017-10-20
  • 打赏
  • 举报
回复
同时启动和同步不是一个概念吧。
FaberChang 2017-10-20
  • 打赏
  • 举报
回复
自己来顶一下
卡卡罗特琪琪 2017-10-20
  • 打赏
  • 举报
回复
我觉得应该是这样,只要当前线程执行了run方法,然后调用wait,直到所有线程都调用了run方法,再最后在调用notifyAll,楼主可以考虑一下。

62,630

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧