首先,我们来说一说同步线程和异步线程
同步线程:按顺序执行线程内容
异步线程:哪个线程先抢占到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