`
lastsoul
  • 浏览: 33173 次
  • 性别: 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

分享到:
评论

相关推荐

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

    内容索引:C#源码,系统相关,多线程 C#多线程互斥,两个线程交替工作,如上图所示,挺有意思的。

    Java线程详解.ppt

    一个进程中可以包含一个或多个线程,一个线程就是程序内部的一条执行线索。 在单线程中,程序代码按调用顺序依次往下执行,不能实现两段程序代码同时交替运行的效果。如果一个程序中要实现两段程序代码同时交替运行...

    多线程面试相关知识点

    多线程程序包含两条或两条以上并发运行的部分,把程序中每个这样的部分都叫作一个线程(thread)。每个线程都有独立的执行路径,因此多线程是多任务处理的一种特殊形式。 多任务处理被所有的现代操作系统所支持...

    Java程序设计案例教程-第8章-多线程编程.pptx

    线程在执行过程中与进程也是有区别的,每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口;但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程的执行控制。 一个线程可以创建和...

    java多线程

    多线程由一个或者多个线程组成的程序就是多线程,Java中,一定是从主线程开始执行(main方法),然后在主线程的某个位置启动新的线程。二、线程的基本操作2.1 创建创建线程的两种方法1、继承java.lang.Thread上述...

    linux系统编程之线程.zip

    两个线程具有各自独立的PCB,但共享同一个页目录,也就共享同一个页表和物理页面。所以两个PCB共享一个地址空间。 实际上,无论是创建进程的fork,还是创建线程的pthread_create,底层实现都是调用同一个内核函数...

    C# 线程同步详解

    但是异步编程同样也存在着很严重的问题,如果两个不同的线程访问相同的变量和数据,按照我们异步函数的实现方式,不可能存在两个线程同时访问相同的数据,这个时候我们就需要线程同步。多个线程同时访问共享数据的时...

    python 如何停止一个死循环的线程

    换句话说,就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。 那什么是多线程?提到多线程这里要说两个概念,就是串行和并行,搞清楚这个,我们才能更好地理解多线程。 所谓串行,其实是相对于单条...

    linux之线程同步的概要介绍与分析

    为了实现这一目标,Linux提供了一系列强大的线程同步机制和工具,让开发者能够高效、安全地控制线程间的执行顺序。以下是一些关键的线程同步方法及其简要描述: 1. **互斥锁(Mutex)**:互斥锁是最基本也是最常用...

    Java 多线程的创建方式

    Java语言内置了多线程支持,当Java程序启动的时候,实际上是启动了一个JVM进程,然后JVM启动主线程来执行 main()方法,在main()方法中我们可以又启动其他线程,每个线程的任务就是执行一段顺序执行的代码,Java使用...

    操作系统期末试题(9套)

    1 分别举出一个在命令行使用输入重定向、输出重定向、管道的例子,并说明使用相应命令的意图。 2 对比“进程”和“线程”的异同。 3 对比动态分页系统中的全局、局部页面置换策略。 4 什么是设备无关性?...

    关于C#执行顺序带来的一些潜在问题

    在一个C# .NET Core 3.1命令行程序中,定义两个全局变量a和b,在线程1中,依次对b和a进行递增。这样,在任何时刻b应当等于a或a+1。 static int a = 0; static int b = 0; static void Thread1() {

    Java Thread 的 run() 与 start() 的区别.docx

    2) run: run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就...

    黑马程序员–Java多线程讲解笔记

    一个进程中至少要有一个线程。当一个进程中线程有多个时,是多线程。  为什么要用多线程  1,让计算机"同时"做多件事情,节约时间。  2,后台运行程序,提高程序的运行效率.。  3,多线程可以让程序...

    Java的线程机制

    一个线程只有一个入口点但可能有几个出口点不过,每个时刻的执行点总是只有一个。线程是不能独立运行的程序,而只是某个整体程序内部的一个顺序执行流。 多线程是Java的一个重要特点。如果一个程序是单线程的,...

    并行最短路径算法Dijkstra

    (2)并发性分析:最外层顺序执行,内层的两个循环实现并发。 (3)线程处理:生成n个线程,2000个数据。n-2个线程分配给当前始终点最短路径的计算,其中(n-2)/2个线程求最近顶点,(n-2)/2个线程更新最短路径数组。...

    IOS多线程开发之线程的状态

    改变这种状况可以从两个角度出发:对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作;...

    web worker线程

    如果您有两个任务,一个将花费10秒,另一个将花费1秒,按照顺序执行,不理想的是必须等待10秒才能执行第二个任务。 2、如果一个任务导致了进程崩溃,那么所有发送给同一进程的任务都将无法完成。

    Java抢火车票程序源码-multithread:多线程

    一个进程运行至少有一个线程在运行,通常说的主线程,那么在Java中如何创建一个线程呢?有两种方法,一继承Thread类,二实现Runnable接口,区别是类只能单继承,接口可以无限。 注意一点:多线程是异步,代码的执行...

    浅谈Python线程的同步互斥与死锁

    线程间通信方法 ...两个或两个以上的进程或线程在运行过程中协同步调,按预定的先后次序运行。比如 A 任务的运行依赖于 B 任务产生的数据。 互斥 : 互斥是一种制约关系,当一个进程或者线程占有资源

Global site tag (gtag.js) - Google Analytics