线程交替有序执行任务

public class Test
{
	// 测试
	public static void main(String[] args) throws Exception
	{
		Object obj = new Object();
		// 启动两个线程
		Thread1 t1 = new Thread1(obj);

		Thread2 t2 = new Thread2(obj);

		t1.start();
		t2.start();
	}

}

// 一个线程打印1-52
class Thread1 extends Thread
{
	private Object obj;

	public Thread1(Object obj)
	{
		this.obj = obj;
	}

	public void run()
	{
		synchronized (obj)
		{
			// 打印1-52
			for (int i = 1; i < 53; i++)
			{
				System.out.print(i + " ");
				if (i % 2 == 0)
				{
					// 不能忘了 唤醒其它线程
					obj.notifyAll();
					try
					{
						obj.wait();
					}
					catch (InterruptedException e)
					{
						e.printStackTrace();
					}
				}
			}
		}

	}

}

// 另一个线程打印字母A-Z
class Thread2 extends Thread
{
	private Object obj;

	public Thread2(Object obj)
	{
		this.obj = obj;
	}

	public void run()
	{
		synchronized (obj)
		{
			// 打印A-Z
			for (int i = 0; i < 26; i++)
			{
				System.out.print((char) ('A' + i) + " ");
				// 不能忘了 唤醒其它线程
				obj.notifyAll();
				try
				{
					// 最后一个就不要等了
					if (i != 25)
					{
						obj.wait();
					}
				}
				catch (InterruptedException e)
				{
					e.printStackTrace();
				}

			}

		}
	}

}

时间: 2024-11-09 00:59:32

线程交替有序执行任务的相关文章

JUC包多线程之线程有序执行

想让多个线程有序执行,必须提供它们之间的唤醒机制.下面以三个线程为例,有序打印自己的线程ID Condition condition1 = lock.newCondition(); //代表线程1的唤醒 Condition condition2 = lock.newCondition();  //代表线程2的唤醒 Condition condition3= lock.newCondition(); //代表线程3的唤醒 同时需要一个Flag作为轮到它们各自执行的条件flag=1线程1执行,不等于

java 多线程–线程交替

要求: 借助同步机制,sleep()方法,join()方法,实现动画显示:甲线程:1.3.5.7.9乙线程:2.4.6.8.10丙线程:a.b.c.d.emain()线程输出:线程开始,线程结束 输出结果:线程开始,1-a-2## 3-b-4## 5-c-6## … 思考: 使用多个判断标记,模拟(消费者-生产者)每线程输出一个后就等待,然后改变自己的标记临界资源–使用多个== putX() == 方法,判断属于自己的标记(== isEmptyX ==)然后输出使多个线程有序的交替执行代码: c

两个线程交替打印信息

看见一个关于两个线程交替打印信息的题目,题目大概是 子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码. 写了两个版本,一个是用了mutex,不用条件变量:另外一个是用条件变量. 第一个,不用条件变量 1 #include <stdio.h> 2 #include <string.h> 3 #include <pthread.h> 4 5 6 7 const int LOOP_

多线程注意事项和获取子线程何时都执行完毕

前言 最近一段时间在整公司项目里一个功能的优化,用到了多线程处理.期间也是踩了不少的坑,在这里想说下我遇到的问题和注意事项.以及怎样知道启动的那些多线程都处理完毕这些问题. 实现Runnable接口类需要注意事项 我这里用的多线程,是用了实现Runnable接口,这样的话,要比继承Thread类更加的灵活.毕竟类只能单继承,但可以多实现. 1.事务失效 我实现Runnable接口的类,是处理业务的handler类,在spring配置里面是默认给这些类添加事务的.所以我当时直接在这个类里面写了业务

经典面试题——两个线程交替打印奇数和偶数

前提 今天下班时候和同事聊天偶然听到面试题“两个线程交替打印奇数和偶数”的实现,这里做一个复盘. 复盘 场景一:线程A打印奇数,线程B打印偶数,线程A和线程B交替打印,使用对象监视器实现. 场景二:线程A打印奇数,线程B打印偶数,线程A和线程B交替打印,使用JDK提供的并发类库实现. 这两个场景中,场景一是一种比较古老的同步方式,本质由JVM实现:场景二是JDK1.5引入JUC包之后简化了并发编程的前提下的更简便的实现.下面针对两个场景做对应的实现. 场景一 场景一中,线程A和线程B交替打印奇数

线程池的执行流程

合理使用线程池能够带来3个好处: 1)降低资源消耗:2)提高响应速度:3)提高线程的可管理性. 那么线程池是如何工作的呢,借用并发编程艺术一书中的话来描述当一个任务提交给线程池之后,线程池会怎么做? 首先,线程池会判断核心线程池里的线程(线程总数是30,则coreSize有可能是10)是否都在执行任务.如果没有比方说当前只有9个线程在工作,则从核心线程池中创建一个新的线程来执行任务.如果当前已经有10个线程在工作了,则进入下一步: 其次,线程池会判断工作队列是否已经满了,如果工作队列没有满,则将

浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别

今天无意中看到有关Invoke和BeginInvoke的一些资料,不太清楚它们之间的区别.所以花了点时间研究了下. 据msdn中介绍,它们最大的区别就是BeginInvoke属于异步执行的. Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线程上执行指定的委托. Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句柄所在线程上异步执行指定委托. msdn说明: 控件上的大多数方法只能从创建控件的线程调用. 如果已经创建控

如何保证线程按顺序执行

Thread类构造方法:1.Thread():2.Thread(String name):3.Thread(Runable r):4.Thread(Runable r, String name): thread类常用方法:start();//启动线程getId();//获得线程IDgetName();//获得线程名字getPriority();//获得优先权isAlive();//判断线程是否活动isDaemon();//判断是否守护线程getState();//获得线程状态sleep(long

Delphi中怎么结束线程(这个线程是定时执行的)(方案二)

上篇博客中提出了一个问题:怎么结束一个定时循环执行的线程,并给出了一个解决方案,但是又出现了一个问题,详细去参考上一篇博客. 然后出去撒了个尿,突然脑子里出现了一个想法(看来工作和思考久了,出去走走,哪怕是去撒个尿,都可能尿出火花,所以工作和学习的时常根本就不等同于效率灵感不是在那里拼命工作.想就能出来的),需要结合上上篇博客:关于FreeOnTerminate的知识 上面所给出的第一种解决方案: 线程(Execute)在执行定时循环:然后先让 DestroyAThread设置 Terminat