`
lastsoul
  • 浏览: 34882 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

两个线程如何顺序执行

 
阅读更多
先看下面的例子:

public class MyThread1 extends Thread {
	@Override
	public void run() {
		for(int i=0;i<10;i++){
			System.out.println(i);
		}
		System.out.println();
	}

}
public class MyThread2 extends Thread {
	public MyThread2(String name) {
		super(name);
	}
	@Override
	public void run() {
		for(int i=0;i<10;i++){
			System.out.println(this.getName()"":"+i);
		}
		System.out.println();
	}

	public static void main(String[] args) {
		Thread t1=new MyThread1("t1");
		Thread t2=new MyThread2("t2");
		t1.start();
		t2.start();
	}
}



输出结果两个线程是交替执行的,而且每次执行结果也不一样。那么如何让这两个线程顺序执行呢?
方法一:在一个线程中调用另一个线程的join方法。MyThread1不动,MyThread2类代码如下:
public class MyThread2 extends Thread {
	/**
	 * 
	 */
	public MyThread2(String name) {
		super(name);
	}
	/* (non-Javadoc)
	 * @see java.lang.Thread#run()
	 */
	@Override
	public void run() {
		[color=red]
Thread t1=new MyThread1("t1");
		try {
			t1.start();
			t1.join(10000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
[/color]		for(int i=0;i<10;i++){
			
			System.out.println(this.getName()+":"+i);
		}
		System.out.println();
	}

	public static void main(String[] args) throws InterruptedException {
		//Thread t1=new MyThread1("t1");
		Thread t2=new MyThread2("t2");
		//t1.start();
		
		
		t2.start();
		
		
	}
}


此方式可以实现顺序执行两个方法。
方法二:采用synchronized关键字,示例代码如下:
public class MyThread1 extends Thread {
	private PrintI pi;
	public MyThread1(String name,PrintI pi) {
		super(name);//线程名称,如果不手动给,系统会给默认值
		this.pi=pi;
	}
	
	@Override
	public void run() {
		
		pi.execute(getName());
		System.out.println();
		
		try {
			sleep(10000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}

public class MyThread2 extends Thread {
	private PrintI pi;
	public MyThread2(String name,PrintI pi) {
		super(name);//线程名称,如果不手动给,系统会给默认值
		this.pi=pi;
	}
	
	@Override
	public  void run() {
		/*
		try {
			Thread t1=new MyThread1("t1",pi);
			t1.start();
			t1.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		*/
		pi.execute(getName());
		System.out.println();
	}

	public static void main(String[] args) throws InterruptedException {
		PrintI pi=new PrintI();
		Thread t2=new MyThread2("t2",pi);
		t2.start();
		Thread t1=new MyThread1("t1",pi);
		t1.start();
		
	}
}

public class PrintI {
	public synchronized void execute(String name) {
		for (int i = 0; i < 10; ++i) {
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(name+": " + i);
		}
	}

}

把打印动作交由PrintI 的对象来处理,将该对象加锁来实现顺序执行。
synchronized 具体用法 请参考:http://www.cnblogs.com/mengdd/archive/2013/02/16/2913806.html

分享到:
评论

相关推荐

    两个线程交替执行

    在上述代码中,我们可以看到两个线程 a 和 b,它们之间通过一个锁对象 LOCK 进行同步。线程 a 负责打印数字 1、2、3,而线程 b 负责打印数字 4、5、6。通过使用 synchronized 关键字,我们可以确保在某个时刻只有一...

    C# 多线程互斥 两个线程交替工作

    对于两个线程交替工作,一个常见的应用场景是控制两个线程按照一定的顺序执行,比如线程A执行一次,然后线程B执行一次,如此循环。以下是一种可能的实现方法: 1. 使用`ManualResetEvent`或`AutoResetEvent`对象...

    java 两个线程相互顺序输出

    标题“java 两个线程相互顺序输出”涉及的问题是如何在多线程环境下控制线程的执行顺序,使得两个线程可以按照特定的顺序交替打印输出。这通常涉及到线程同步和通信的概念。下面将详细解释这些知识点。 1. **线程...

    java程序 两个线程实现学生成绩的读写

    为了启动这两个线程,我们会在主程序中创建它们的实例,然后调用`start()`方法。线程的执行顺序取决于JVM的调度策略,因此可能读线程先执行,也可能写线程先执行。为了避免混乱,可能需要设定一些同步规则,比如使用...

    JAVA线程高级-线程按序交替执行

    - `Exchanger`则允许两个线程交换数据,每次只有一个线程可以完成交换,从而实现交替执行。 4. **线程间的通信**: - `wait()`, `notify()`, `notifyAll()`是Object类的方法,用于线程间的通信。一个线程调用`...

    实现一个数据单元,包括学号和姓名两部分。编写两个线程,一个线程往数据单元中写,另一个线程往出读。要求每写一次就往出读一次。

    本实验的任务是设计并实现一个数据单元,该单元包含学号和姓名两个字段,并且使用两个线程,一个用于写入数据,另一个用于读取数据。这种设计模式被称为“生产者-消费者”问题,是多线程编程中的经典案例。 首先,...

    多线程编程死锁和事件对象设置线程顺序.rar_4 3 2 1_stepaqr_线程

    这种方式还可以防止死锁,死锁是指两个或多个线程互相等待对方释放资源而无法继续执行的情况。在本例中,每个线程只等待前一个线程完成并发出信号才会执行,所以不会出现死锁。 线程的创建通常使用`CreateThread`...

    易语言多线程执行任务例程

    接着,使用“启动线程”命令,让这个线程开始执行。 2. **线程同步与通信**:在多线程环境下,线程间的同步和通信是保证程序正确性的关键。易语言提供了如“等待”、“唤醒”、“信号量”等同步机制,用于控制线程...

    semaphore控制多线程循序执行

    例如,如果我们要实现一个打印队列,让多个线程按顺序打印任务,Semaphore就可以用来保证打印任务的顺序执行,防止多个线程同时打印。 以下是如何使用Semaphore的基本步骤: 1. 初始化Semaphore:创建一个...

    python 实现两个线程交替执行

    线程交替执行,即让两个线程按照特定顺序交替进行,是线程同步的一种表现,它通常用于确保线程间操作的有序性和避免竞态条件。在本示例中,我们将探讨如何在Python中实现两个线程的交替执行。 首先,让我们分析给定...

    c#多线程顺序打印1-100数字-源码.rar

    例如,如果创建了两个线程,一个打印1-50,另一个打印51-100。 2. **初始化AutoResetEvent**:每个线程在启动前都会获得一个`AutoResetEvent`实例,初始状态为未设置(即等待状态)。 3. **线程执行**:每个线程...

    多线程之间的线程通信

    另一个问题是**死锁(Deadlock)**,即两个或更多线程相互等待对方释放资源,导致所有线程都无法继续执行。 为了避免这些问题,开发者需要遵循一些最佳实践,如最小化共享状态、使用线程安全的数据结构、正确地使用...

    两个线程操作游戏原代码

    标题提到的“两个线程操作游戏原代码”指的是一个使用两个独立线程来运行的游戏应用。这种设计模式允许游戏的不同部分并行处理,提高性能,同时也可能涉及到一些同步和通信机制。 一、线程的概念 线程是操作系统...

    C#多线程互斥实例 多线程获取同一变量

    测试这个多线程互斥的例子,我们可以创建多个线程,每个线程分别调用`Increment`或`Decrement`方法,然后观察`GetValue`返回的值是否正确反映了操作的顺序。在`多线程test`这个项目中,很可能包含了这样的测试代码,...

    C#多线程互斥,两个线程交替工作

    下面是一个简单的示例,展示了如何创建两个线程并让它们交替执行: ```csharp using System; using System.Threading; class Program { static Mutex mutex = new Mutex(); static void ThreadWorker(object ...

    C# 多线程异步执行

    尤其是在C#这样的高级语言中,这两个特性被广泛应用于处理耗时任务,如网络I/O操作,如下载图片。本文将深入探讨如何使用C#的多线程和异步执行,以及如何结合委托事件来实现这一目标。 首先,让我们理解“多线程”...

    java两个线程互相守护

    这样,两个线程就能按照预期顺序交替执行。 需要注意的是,`wait()`、`notify()`和`notifyAll()`都必须在同步块或同步方法中调用,以避免出现`IllegalMonitorStateException`。此外,线程被唤醒后并不立即恢复执行...

    C++11用两个线程轮流打印整数的实现方法

    这样,两个线程就可以交替打印数字,保证了顺序的正确性。 在`main()`函数中,我们创建了两个线程`t1`和`t2`,分别执行`printeven()`和`printodd()`,最后使用`join()`等待两个线程执行完毕,确保程序不会提前结束...

    控制台展示执行顺序

    在这个示例中,尽管两个线程同时启动,但由于`printOrder`方法是同步的,所以它们会交替执行,确保了输出的顺序。 在更复杂的应用场景中,`java.util.concurrent`包下的工具如`ExecutorService`、`Future`和`...

    delphi 多线程 读取数据

    为了实现这一目标,我们将文件内容分割成前后两部分,并创建两个线程,每个线程负责读取并处理一部分数据。这样做可以避免一次性加载整个文件到内存中,减少对系统资源的需求,同时利用多核处理器的优势,提高数据...

Global site tag (gtag.js) - Google Analytics