先看下面的例子:
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#多线程互斥,两个线程交替工作,如上图所示,挺有意思的。
一个进程中可以包含一个或多个线程,一个线程就是程序内部的一条执行线索。 在单线程中,程序代码按调用顺序依次往下执行,不能实现两段程序代码同时交替运行的效果。如果一个程序中要实现两段程序代码同时交替运行...
多线程程序包含两条或两条以上并发运行的部分,把程序中每个这样的部分都叫作一个线程(thread)。每个线程都有独立的执行路径,因此多线程是多任务处理的一种特殊形式。 多任务处理被所有的现代操作系统所支持...
线程在执行过程中与进程也是有区别的,每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口;但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程的执行控制。 一个线程可以创建和...
多线程由一个或者多个线程组成的程序就是多线程,Java中,一定是从主线程开始执行(main方法),然后在主线程的某个位置启动新的线程。二、线程的基本操作2.1 创建创建线程的两种方法1、继承java.lang.Thread上述...
两个线程具有各自独立的PCB,但共享同一个页目录,也就共享同一个页表和物理页面。所以两个PCB共享一个地址空间。 实际上,无论是创建进程的fork,还是创建线程的pthread_create,底层实现都是调用同一个内核函数...
但是异步编程同样也存在着很严重的问题,如果两个不同的线程访问相同的变量和数据,按照我们异步函数的实现方式,不可能存在两个线程同时访问相同的数据,这个时候我们就需要线程同步。多个线程同时访问共享数据的时...
换句话说,就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。 那什么是多线程?提到多线程这里要说两个概念,就是串行和并行,搞清楚这个,我们才能更好地理解多线程。 所谓串行,其实是相对于单条...
为了实现这一目标,Linux提供了一系列强大的线程同步机制和工具,让开发者能够高效、安全地控制线程间的执行顺序。以下是一些关键的线程同步方法及其简要描述: 1. **互斥锁(Mutex)**:互斥锁是最基本也是最常用...
Java语言内置了多线程支持,当Java程序启动的时候,实际上是启动了一个JVM进程,然后JVM启动主线程来执行 main()方法,在main()方法中我们可以又启动其他线程,每个线程的任务就是执行一段顺序执行的代码,Java使用...
1 分别举出一个在命令行使用输入重定向、输出重定向、管道的例子,并说明使用相应命令的意图。 2 对比“进程”和“线程”的异同。 3 对比动态分页系统中的全局、局部页面置换策略。 4 什么是设备无关性?...
在一个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() {
2) run: run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就...
一个进程中至少要有一个线程。当一个进程中线程有多个时,是多线程。 为什么要用多线程 1,让计算机"同时"做多件事情,节约时间。 2,后台运行程序,提高程序的运行效率.。 3,多线程可以让程序...
一个线程只有一个入口点但可能有几个出口点不过,每个时刻的执行点总是只有一个。线程是不能独立运行的程序,而只是某个整体程序内部的一个顺序执行流。 多线程是Java的一个重要特点。如果一个程序是单线程的,...
(2)并发性分析:最外层顺序执行,内层的两个循环实现并发。 (3)线程处理:生成n个线程,2000个数据。n-2个线程分配给当前始终点最短路径的计算,其中(n-2)/2个线程求最近顶点,(n-2)/2个线程更新最短路径数组。...
改变这种状况可以从两个角度出发:对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作;...
如果您有两个任务,一个将花费10秒,另一个将花费1秒,按照顺序执行,不理想的是必须等待10秒才能执行第二个任务。 2、如果一个任务导致了进程崩溃,那么所有发送给同一进程的任务都将无法完成。
一个进程运行至少有一个线程在运行,通常说的主线程,那么在Java中如何创建一个线程呢?有两种方法,一继承Thread类,二实现Runnable接口,区别是类只能单继承,接口可以无限。 注意一点:多线程是异步,代码的执行...
线程间通信方法 ...两个或两个以上的进程或线程在运行过程中协同步调,按预定的先后次序运行。比如 A 任务的运行依赖于 B 任务产生的数据。 互斥 : 互斥是一种制约关系,当一个进程或者线程占有资源