Java中多个线程按顺序执行
基本思想:建立了一个队列,为每一个Thread保存了一个对象锁,保证按顺序执行。线程启动的时候,使随机的,但是执行代码是按顺序的。
import java.util.LinkedList;
import java.util.Queue;
public class ThreadTest {
private static Queue qThread=new LinkedList();//线程同步对象队列
public static synchronized void putObject(Object t){
qThread.offer(t);
}
public static synchronized Object getObject(){
return qThread.poll();
}
public static void waitThread(Object t) throws InterruptedException{
synchronized(t){
t.wait();
}
}
public static void notifyThread(){
Object obj=ThreadTest.getObject();
synchronized(obj){
obj.notify();
}
}
public static void main(String[] args) throws InterruptedException {
int i = 0;
boolean isFirst=true;
while (i < 10) {
Object obj=new Object();
if(i>0){
isFirst=false;
ThreadTest.putObject(obj);
}
Thread t2 = new Thread2(isFirst,obj);
Object obj2=new Object();
ThreadTest.putObject(obj2);
Thread t3 = new Thread3(obj2);
t2.start();
t3.start();
i++;
}
}
}
/**
* 线程2
*
* @author Harry.WANG
*
*/
class Thread2 extends Thread {
private boolean isFirst=false;
private Object obj;
public Thread2(boolean f,Object obj){
this.isFirst=f;
this.obj=obj;
}
@Override
public void run() {
if(!this.isFirst){
System.out.println(this.getName()+"等待...");
try{
ThreadTest.waitThread(obj);
}catch(InterruptedException e){
e.printStackTrace();
}
}
System.out.println("启动"+this.getName()+"...");
try {
sleep(3000);//等待3秒,为了测试
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("停止"+this.getName()+"...");
ThreadTest.notifyThread();
}
}
class Thread3 extends Thread {
private Object obj;
public Thread3(Object obj){
this.obj=obj;
}
@Override
public void run() {
System.out.println(this.getName()+"等待...");
try{
ThreadTest.waitThread(obj);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("启动"+this.getName()+"...");
try {
sleep(3000);//等待3秒,为了测试
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("停止"+this.getName()+"...");
ThreadTest.notifyThread();
}
}
引用:http://netjavaliu.blog.sohu.com/143449586.html
分享到:
相关推荐
在Java编程中,多线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而提高了系统的效率和响应性。然而,在某些场景下,我们可能需要控制线程的执行顺序,确保它们按照特定的顺序交替运行,这在并发编程...
在上述的10个线程顺序打印1-100的问题中,可能的解决方案包括但不限于创建一个共享的计数器,使用`synchronized`和`wait/notify`,或者使用`Semaphore`,`CyclicBarrier`等并发工具。每个解决方案都需要考虑线程安全...
在上面的示例代码中,我们可以看到thread1、thread2、thread3三个线程按照顺序执行的顺序是:产品经理规划新需求 -> 开发人员开发新需求功能 -> 测试人员测试新功能。这里使用join()方法来实现线程的顺序执行。 二...
- 在Java中,线程同步是为了避免多个线程对共享资源的不正确访问,防止数据的不一致性。Java提供了多种同步机制,如`synchronized`关键字、`Lock`接口(如`ReentrantLock`)、`Semaphore`信号量、`CyclicBarrier`...
Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...
多线程并行执行是指在同一个程序中同时运行多个线程,每个线程负责不同的任务,以实现任务的并发执行。这种技术可以充分利用多核处理器的优势,将CPU的计算能力最大化,从而提高程序的运行效率。在Java中,可以通过...
通过创建多个线程,程序可以在同一时间执行多个任务,提高了CPU的利用率和程序的响应速度。多线程可以分为并发和并行两种。并发是在单核CPU中,通过快速切换线程执行来实现的“同时”运行;而并行则是在多核CPU中,...
Java多线程按指定顺序同步执行是Java编程中的一种常见问题,即如何让多个线程按照既定的顺序依次执行。下面将介绍三种解决方案,分别使用newSingleThreadExecutor、join方法和ThreadPoolExecutor。 方法1:使用...
Java程序中的多线程技术是实现并发...总的来说,这个Java程序展示了如何在并发环境中处理读写操作,是理解和实践Java多线程的一个好例子。通过学习这个程序,我们可以深入理解Java线程的使用以及并发编程中的核心概念。
死锁是多线程编程中的常见问题,两个或多个线程互相等待对方释放资源,导致无法继续执行。Java的jstack工具可以帮助检测死锁,而在编程时应避免循环等待,合理设计锁的获取顺序,以减少死锁的风险。 以上就是Java多...
1. **线程的基本概念**:线程是程序执行的最小单位,一个进程中可以有多个线程同时运行。Java通过`Thread`类和`Runnable`接口来创建和管理线程。每个线程都有自己的生命周期,包括新建、就绪、运行、阻塞和结束五个...
- **CyclicBarrier**:允许多个线程等待直到达到某个屏障点再一起继续执行。 - **Semaphore**:信号量,控制同时访问特定资源的线程数量。 - **ThreadPoolExecutor**:线程池,管理线程并处理任务队列,能有效...
标题中的“多个线程到达后才能执行某个任务,并且只能执行一次”指的是在多线程环境下,需要确保一个任务在所有等待线程都到达特定条件后才开始执行,并且这个任务在整个程序运行过程中只被执行一次。这通常涉及到...
首先,Java多线程允许程序同时执行多个任务,这通过创建并运行多个线程来实现。在Java中,可以通过继承Thread类或实现Runnable接口来创建线程。继承Thread类可以直接重写run()方法,而实现Runnable接口则需要创建一...
java多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印...
在单线程环境中,程序按照顺序执行任务,而在多线程环境中,可以同时执行多个任务,每个任务被称为一个线程。Java通过`Thread`类和`Runnable`接口提供了对多线程的支持。创建线程有两种方式:继承`Thread`类或实现`...
Java并发工具类 (`java.util.concurrent` 包) 提供了高级线程管理工具,如`ExecutorService`用于管理和控制线程池,`CountDownLatch`用于同步多个线程,`CyclicBarrier`让一组线程等待其他线程到达屏障点,以及`...
1. **同步与互斥**:当多个线程同时访问同一资源(如共享的图片存储位置)时,可能会引发数据不一致的问题。Java提供了多种同步机制,如`synchronized`关键字、`Lock`接口以及`ReentrantLock`等,确保在同一时刻只有...
例如,如果我们要实现一个打印队列,让多个线程按顺序打印任务,Semaphore就可以用来保证打印任务的顺序执行,防止多个线程同时打印。 以下是如何使用Semaphore的基本步骤: 1. 初始化Semaphore:创建一个...