同步线程

首先,我们来说一说同步线程和异步线程

同步线程:按顺序执行线程内容

异步线程:哪个线程先抢占到CPU资源就走那个线程

那么,怎样解决线程同步的问题呢?

解决方案有两种:

1.先创建一个Person类,类中有两个方法peron1和person2,分别在void的之前加上同步锁synchronized,这样就可以保证线程同步

public class Person {
    public synchronized void person1()
    {
        System.out.print("弓");
        System.out.print("长");
        System.out.print("成");
        System.out.println();
    }
    public synchronized void person2()
    {
        System.out.print("弓长");
        System.out.print("长弓");
        System.out.print("弓长成");
        System.out.println();
    }
}

然后创建两个自定义类,各自继承Thread类,在run方法中分别调用Person类中的person1和person2的方法

public class MyThread1 extends Thread{
    public Person p;
    @Override
    public void run() {
        for (int i = 1; i < 500; i++) {

            p.person1();
        }

    }
}
public class MyThread2 extends Thread{
    public Person p;
    @Override
    public void run() {
        for (int i = 1; i < 500; i++) {
            p.person2();
        }
    }
}

然后在Test测试类中就可以开启线程了

public class Test2 {
    public static void main(String[] args) {
        Person p=new Person();
        MyThread1 my1=new MyThread1();
        my1.p=p;
        my1.start();
        MyThread2 my2=new MyThread2();
        my2.p=p;
        my2.start();
    }

}

执行结果:

这种方法就可以保证线程同步,不会因为抢占CPU出现两个线程异步的效果了.

2.在Person类中的两个方法中加入同步锁方法体,也能解决线程异步的效果

public class Person {
    public void person1()
    {
        synchronized(this)
        {
            System.out.print("弓");
            System.out.print("长");
            System.out.print("成");
            System.out.println();
        }

    }
    public synchronized void person2()
    {
        synchronized (this) {
            System.out.print("弓长");
            System.out.print("长弓");
            System.out.print("弓长成");
            System.out.println();
        }

    }
}

控制台输出结果:

时间: 2024-12-20 14:37:46

同步线程的相关文章

线程同步--线程间通信

一.线程同步 线程的同步方法跟其他系统下类似,我们可以用原子操作,可以用 mutex,lock 等. iOS 的原子操作函数是以 OSAtomic 开头的,比如:OSAtomicAdd32, OSAtomicOr32 等等.这些函数可以直接使用,因为它 们是原子操作. iOS 中的 mutex 对应的是 NSLock,它遵循 NSLooking 协议,我们可以使用 lock, tryLock, lockBeforeData:来加锁,用 unLock 来解锁.使用示例: BOOL moreToDo

Qt同步线程(比较清楚,而且QMutex QMutexLocker QReadWriteLock QSemaphore QWaitCondition 每个都有例子)

Qt同步线程 我们知道,多线程有的时候是很有用的,但是在访问一些公共的资源或者数据时,需要进行同步,否则会使数据遭到破坏或者获取的值不正确.Qt提供了一些类来实现线程的同步,如QMutex,QMutexLocker,QReadWriteLock,QReadLocker,QWriteLocker,QSemaphore和QWaitCondition.下面我们分别来看它们的用法: QMutex 首先,简单的了解一下QMutex提供的函数. 构造函数:QMutex ( RecursionMode mod

深入理解计算机系统——第12章:用信号量同步线程

用信号量同步线程: 同步错误: 一般而言你没有办法预测操作系统是否将你的线程选择一个正确的顺序执行. 12.5.1 进度图 (1)进度图:将n个并发线程的执行模型化为一条n维笛卡尔空间中的轨迹线. (2)每条轴k对应着线程k的进度. (3)每个点Ik代表着k线程已完成指令Ik这一个状态,原点处代表初始状态. (4)进度图是指令执行模型化为从一个状态到另一个状态的转换,两条指令不能在同一时刻完成,对角线不允许的.

用GCD线程组与GCD信号量将异步线程转换为同步线程

有时候我们会碰到这样子的一种情形: 同时获取两个网络请求的数据,但是网络请求是异步的,我们需要获取到两个网络请求的数据之后才能够进行下一步的操作,这个时候,就是线程组与信号量的用武之地了. 线程组用以监听线程的执行情况,而信号量就是用来将异步线程转化为同步线程. 以下是打印的数据: 2015-02-25 18:34:23.208 YXMWeather[265:8748] 请求1数据 2015-02-25 18:34:23.209 YXMWeather[265:8790] 1信号量结束 2015-

38.线程三--&gt;多线程数据安全和同步线程的方法

学习要点 多线程数据安全 同步线程的方法 class MyThread implements Runnable{//MyThread 实现Runnable接口 int i = 100; public void run(){ //复写run方法 while(true){ synchronized(this){  //线程同步代码 //Thread.currentThread()获取当前这段代码正在哪个线程运行 System.out.println(Thread.currentThread().ge

Objective-C中的同步线程的锁

概述 在多线程编程中往往会遇到多个线程同时访问共享的资源,这种情况我们需要通过同步线程来避免.也就是给线程加锁. 因为Objective-C是C语言的超集.,严格的来说是真超集.所以C语言当中的pthread互斥锁在Objective-C中也可以使用,但是Objective-C中定义了本身自己的锁对象和锁协议,所以本篇介绍Objective-C中的锁. NSLock NSLocking协议 @protocol NSLocking - (void)lock; - (void)unlock; @en

Linux多线程--使用互斥量同步线程【转】

本文转载自:http://blog.csdn.net/ljianhui/article/details/10875883 前文再续,书接上一回,在上一篇文章:Linux多线程——使用信号量同步线程中,我们留下了一个如何使用互斥量来进行线程同步的问题,本文将会给出互斥量的详细解说,并用一个互斥量解决上一篇文章中,要使用两个信号量才能解决的只有子线程结束了对输入的处理和统计后,主线程才能继续执行的问题. 一.什么是互斥量 互斥量是另一种用于多线程中的同步访问方法,它允许程序锁住某个对象,使得每次只能

Linux多线程--使用信号量同步线程【转】

本文转载自:http://blog.csdn.net/ljianhui/article/details/10813469 信号量.同步这些名词在进程间通信时就已经说过,在这里它们的意思是相同的,只不过是同步的对象不同而已.但是下面介绍的信号量的接口是用于线程的信号量,注意不要跟用于进程间通信的信号量混淆,关于用于进程间通信的信号量的详细介绍可以参阅我的另一篇博文:Linux进程间通信——使用信号量.相似地,线程同步是控制线程执行和访问临界区域的方法. 一.什么是信号量 线程的信号量与进程间通信中

线程:主线程、子线程 同步线程、异步线程 单线程、多线程 System.Threading与System.Windows.Threading

入门-------------------------------------------------------------------------------- 概述与概念    一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为“主线程”)自动创建. 创建和开始使用多线程    public Window1()    {        //主线程         //Code……        //使用匿名方法来启动子线程        Thread t = new Th