赞
踩
public class Task2 { public synchronized static void doLongTimeTaskA() { System.out.println("name = " + Thread.currentThread().getName() + ", begain ,"+ new Date()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("name = " + Thread.currentThread().getName() + ", end ,"+ new Date()); } public synchronized static void doLongTimeTaskB() { System.out.println("name = " + Thread.currentThread().getName() + ", begain ,"+ new Date()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("name = " + Thread.currentThread().getName() + ", end ,"+ new Date()); } public synchronized void doLongTimeTaskC() { System.out.println("name = " + Thread.currentThread().getName() + ", begain ,"+ new Date()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("name = " + Thread.currentThread().getName() + ", end ,"+ new Date()); } static class ThreadA extends Thread{ private Task2 mTask2; public ThreadA(Task2 tk){ mTask2 = tk; } @Override public void run() { mTask2.doLongTimeTaskA(); } } static class ThreadB extends Thread{ private Task2 mTask2; public ThreadB(Task2 tk){ mTask2 = tk; } @Override public void run() { mTask2.doLongTimeTaskB(); } } static class ThreadC extends Thread{ private Task2 mTask2; public ThreadC(Task2 tk){ mTask2 = tk; } @Override public void run() { mTask2.doLongTimeTaskC(); } } public static void main(String[] args) { Task2 mTask2 = new Task2(); ThreadA ta = new ThreadA(mTask2); ThreadB tb = new ThreadB(mTask2); ThreadC tc = new ThreadC(mTask2); ta.setName("A"); tb.setName("B"); tc.setName("C"); ta.start(); tb.start(); tc.start(); } }
执行的结果如下:
name = A, begain ,Sat Jun 11 09:45:49 CST 2022
name = C, begain ,Sat Jun 11 09:45:49 CST 2022
name = C, end ,Sat Jun 11 09:45:50 CST 2022
name = A, end ,Sat Jun 11 09:45:50 CST 2022
name = B, begain ,Sat Jun 11 09:45:50 CST 2022
name = B, end ,Sat Jun 11 09:45:51 CST 2022
大家在跑的时候可以多跑几个例子,因为并不是每次跑该程序的结果都是一样的
多跑几次结合数据我们可以发现由于doLongTimeTaskA方法和doLongTimeTaskB方法都是用static修饰的synchronize类锁,即同一个锁,所以 A和B是按顺序执行(类的层面上应该是整个进程唯一的),即同步的。
而doLongTimeTaskC是对象锁,和A/B不是同一种锁,所以C和A、B是 异步执行的。(A、B、C代指上面的3中方法,A、B为类锁, C为对象锁即没有static修饰的方法)。
@Override
public void run() {
mTask2.doLongTimeTaskC();
}
public static void main(String[] args) { Task2 mTask2 = new Task2(); Task2 mTask3 = new Task2(); Task2 mTask4 = new Task2(); ThreadA ta = new ThreadA(mTask2); ThreadB tb = new ThreadB(mTask3); ThreadC tc = new ThreadC(mTask4); ta.setName("A"); tb.setName("B"); tc.setName("C"); ta.start(); tb.start(); tc.start(); }
public static void main(String[] args) {
Task2 mTask2 = new Task2();
ThreadA ta = new ThreadA(mTask2);
ThreadB tb = new ThreadB(mTask2);
ThreadC tc = new ThreadC(mTask2);
ta.setName("A");
tb.setName("B");
tc.setName("C");
ta.start();
tb.start();
tc.start();
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。