让线程的执行变得有序

线程如何有序执行。
(1)使用共享变量的方式:代码如下
利用原子递增控制线程准入顺序
public class OrderedThread1 {
  
 static AtomicInteger count = new AtomicInteger(0);
 
 public static void main(String[] args) throws InterruptedException {
 Task task1 = new Task(count, 0);
 Task task2 = new Task(count, 1);
 Task task3 = new Task(count, 2);
 Thread thread1 = new Thread(task1);
 Thread thread2 = new Thread(task2);
 Thread thread3 = new Thread(task3);
 thread1.setDaemon(true);
 thread2.setDaemon(true);
 thread3.setDaemon(true);
 thread1.start();
 thread2.start();
 thread3.start();
  
 Thread.sleep(1 * 1000);
 }
 
}
 
class Task implements Runnable {
  
 private AtomicInteger count;
 private int order;
  
 public Task(AtomicInteger count, int order) {
 this.count = count;
 this.order = order;
 }
 
 @Override
 public void run() {
 while (true) {
  if (count.get() % 3 == order) {
  System.out.println(Thread.currentThread().getName() + " ===== "+ order);
  count.incrementAndGet();
  }
 }
 }
}
(2)利用volatile来控制线程顺序,其实和上述思想一样,Atomic和volatile都保证代表顺序的数字是线程安全的
public class OrderedThread2 {
	 static Holder holder = new Holder();
	 public static void main(String[] args) throws InterruptedException {
	  
	 Task1 task1 = new Task1(holder, 0);
	 Task1 task2 = new Task1(holder, 1);
	 Task1 task3 = new Task1(holder, 2);
	 Thread thread1 = new Thread(task1);
	 Thread thread2 = new Thread(task2);
	 Thread thread3 = new Thread(task3);
	 thread1.setDaemon(true);
	 thread2.setDaemon(true);
	 thread3.setDaemon(true);
	 thread1.start();
	 thread2.start();
	 thread3.start();
	  
	 Thread.sleep(1 * 1000);
	  
	 
	 }
	 
	}
	 
	class Task1 implements Runnable {
	  
	 Holder holder;
	 int order;
	  
	 public Task1(Holder holder, int order) {
	 this.holder = holder;
	 this.order = order;
	 }
	 
	 @Override
	 public void run() {
	 while (true) {
	  if (holder.count % 3 == order) {
	  System.out.println(Thread.currentThread().getName() + " ===== "+ order);
	  holder.count ++;
	  }
	 }
	// int i = 0;
	// while(i ++ < 10000){
	//  holder.count ++;
	// }
	 }
	}
	class Holder {
	 volatile int count = 0;
	}

(3)用Thread.join方法: 在父线程中 子线程调用join方法,会使得子线程运行完之后,父线程再运行
public class JoinTest {

public static void main(String[] args) {
final Thread join1 = new Thread(new Runnable() {


@Override
public void run() {
  System.out.println("join1");  
}  
}, "T1");

final Thread join2 = new Thread(new Runnable() {
@Override
public void run() {
 
try {
join1.join();//确定join1执行完毕
System.out.println("join2"); 
} catch (InterruptedException e) {
e.printStackTrace();
}
}  
}, "T2");
final Thread join3 = new Thread(new Runnable() {
@Override
public void run() {
try {
join2.join();//确定join2执行完毕
System.out.println("join3");  

} catch (InterruptedException e) {
e.printStackTrace();
}
}  
}, "T3");
join1.start();
join2.start();
join3.start();
}
}
(4)线程池   newSingleThreadExecutor  这个线程处理完一个任务后接着处理下一个任务

public class JoinTest1 {


public static void main(String[] args) {
final Thread join1 = new Thread(new Runnable() {


@Override
public void run() {
  System.out.println("join1");  
}  
}, "T1");

final Thread join2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("join2");  
}  
}, "T2");
final Thread join3 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("join3");  
}  
}, "T3");
   ExecutorService executor = Executors.newSingleThreadExecutor();
        executor.submit(join1);
        executor.submit(join2);
        executor.submit(join3);
        executor.shutdown();
}
}

以上四种方式,有好的方法需要继续跟踪

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值