Java 线程同步执行(顺序执行)

关于线程,有两种实现方法, 一种是通过继承Runnable接口,另外一种通过扩展Thread类,两者的具体差别,可参考我找的这篇文章 http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html 。本主主要是讲 线程的同步执行问题。。

  如果程序是通过扩展Thread类的,网上的资料说可以通过 join()函数实现,但本人亲测,此法无法通过、程序如下:

public class test1 extends Thread {

    public void run() {
        synchronized (this) {
            for(int i = 0; i < 6;i++) {
                System.out.println(Thread.currentThread().getName()+"   1");
                System.out.println(Thread.currentThread().getName()+"   2");
                System.out.println(Thread.currentThread().getName()+"   3");
            }
        }
    }

    public static void main(String arg0[]) throws InterruptedException {
        test1 test1 = new test1();
        Thread thread1 = new Thread(test1,"test1");
        Thread thread2 = new Thread(test1,"test2");
        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();
    }

}

可能的运行结果:

test2   1
test2   2
test2   3
test2   1
test2   2
test2   3
test2   1
test2   2
test2   3
test2   1
test2   2
test2   3
test2   1
test2   2
test2   3
test2   1
test2   2
test2   3
test1   1
test1   2
test1   3
test1   1
test1   2
test1   3
test1   1
test1   2
test1   3
test1   1
test1   2
test1   3
test1   1
test1   2
test1   3
test1   1
test1   2
test1   3

由此可见,线程的执行结果并非我们所需要的。因此,只能另寻途径。

线程的另外一种实现方法是通过实现Runnable接口,程序如下:

public class test1 implements Runnable {

    public void run() {
        synchronized (this) {
            for(int i = 0; i < 6;i++) {
                System.out.println(Thread.currentThread().getName()+"   1");
                System.out.println(Thread.currentThread().getName()+"   2");
                System.out.println(Thread.currentThread().getName()+"   3");
            }
        }
    }

    public static void main(String arg0[]) throws InterruptedException {
        test1 test1 = new test1();
        Thread thread1 = new Thread(test1,"test1");
        Thread thread2 = new Thread(test1,"test2");
        thread1.start();
        thread2.start();
    }

}

多次执行程序,并未出现异常:

test1   1
test1   2
test1   3
test1   1
test1   2
test1   3
test1   1
test1   2
test1   3
test1   1
test1   2
test1   3
test1   1
test1   2
test1   3
test1   1
test1   2
test1   3
test2   1
test2   2
test2   3
test2   1
test2   2
test2   3
test2   1
test2   2
test2   3
test2   1
test2   2
test2   3
test2   1
test2   2
test2   3
test2   1
test2   2
test2   3

Java 线程同步执行(顺序执行)

时间: 2024-10-06 23:10:02

Java 线程同步执行(顺序执行)的相关文章

Java深入学习12:线程按目标顺序执行以及Lock锁和Condiiton接口

Java深入学习12:线程按目标顺序执行以及Lock锁和Condiiton接口 一.一个多线程问题,有三类线程,分别是A.B.C,如如实现ABCABCABCABCABC,顺次执行. 方案1.代码如下 import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Thr

Java线程同步(synchronized)——卖票问题

卖票问题通常被用来举例说明线程同步问题,在Java中,采用关键字synchronized关键字来解决线程同步的问题. Java任意类型的对象都有一个标志位,该标志位具有0,1两种状态,其开始状态为1,当某个线程执行了synchronized(object)语句后,object对象的标志位变为0状态,直到执行完整个synchronized语句中的代码块后,该对象的标志位又回到1状态. 当一个线程执行到synchronized(object)语句的时候,先检查object对象的标志位,如果为0状态,

(转) Java线程同步阻塞, sleep(), suspend(), resume(), yield(), wait(), notify()

为了解决对共享存储区的访问冲突,Java 引入了同步机制.但显然不够,因为在任意时刻所要求的资源不一定已经准备好了被访问,反过来,同一时刻准备好了的资源也可能不止一个. 为解决访问控制问题,Java 引入阻塞机制.阻塞指的是暂停一个Java线程同步的执行以等待某个条件发生(如某资源就绪). sleep():允许指定以毫秒为单位的一段时间作为参数,它使得线程在指定的时间内进入阻塞状态,不能得到CPU 时 间,指定的时间一过,线程重新进入可执行状态.典型地,sleep() 被用在等待某个资源就绪的情

Java线程同步和并发第1部分

通过优锐课核心java学习笔记中,我们可以看到,码了很多专业的相关知识, 分享给大家参考学习.我们将分两部分介绍Java中的线程同步,以更好地理解Java的内存模型. 介绍 Java线程同步和并发是复杂应用程序各个设计阶段中讨论最多的主题. 线程,同步技术有很多方面,它们可以在应用程序中实现高并发性. 多年来,CPU(多核处理器,寄存器,高速缓存存储器和主内存(RAM))的发展已导致通常是开发人员往往忽略的某些领域-例如线程上下文,上下文切换,变量可见性,JVM内存 型号与CPU内存型号. 在本

Java 线程同步

Java 线程同步根本上是要符合一个逻辑:加锁------>修改------>释放锁 1.同步代码块 示例如下: public class SyncBlock { static class DataWrap { int i; } static class SyncBlockThread extends Thread { private DataWrap date; public SyncBlockThread(DataWrap dataWrap) { this.date = dataWrap;

java线程 同步临界区:thinking in java4 21.3.5

thinking in java 4免费下载:http://download.csdn.net/detail/liangrui1988/7580155 package org.rui.thread.critical; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutorService; import java.uti

Java线程同步模型-生产者与消费者

Java生产者与消费者模型是经典Java线程同步模型,涉及使用同步锁控制生产者线程和消费者线程同步运行问题.同步对象是仓库资源,生产者线程生产向仓库中生产商品,消费者线程从仓库中消费商品,当生产者线程生产的商品达到仓库的90%时,生产者线程停止生产并通知消费者线程开始消费,当消费者线程消耗到仓库的10%时,消费者线程停止消费并通知生产者线程恢复生产,如此循环往复过程. 如下图解: T1时刻分析 T2时刻 T3时刻 T4时刻 上图的分析,T3同T1时刻相同场景,T2同T2时刻相同场景,程序如此循环

JAVA多线程按指定顺序执行线程 Condition应用

package concurrent; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; /** * Auth: zhouhongliang * Date:2019/8/1 * 线程等待与唤醒机制 Condition * 按指定顺序执行线程 */ public class ConditionDemo { public static void main(Stri

JAVA基础--程序是顺序执行的

class Testa { public static void main(String[] args) { String aa="aaa"; String bb="bbb"+aa; aa="cccc"; System.out.println(bb); } } 输出的是 "bbbaaa   class Testa { public static void main(String[] args) { String aa="aaa