主线程显示,休眠3秒,次线程显示,休眠1秒
发布网友
发布时间:2023-01-17 05:21
我来回答
共1个回答
热心网友
时间:2023-09-09 04:24
一样的题目?是线程互斥吧。这是java版本的,昨天我才回答过。
package com.cao.test;
public class Test3 {
public static void main(String args[]) throws Exception {
Thread t1 = new Thread(new Runnable() {
public void run() {
try {
long s3 = System.currentTimeMillis();
System.out.println("-----分线程占用中----------");
Singleton.getSigleton().getStr("F");
System.out.println("-----分线程占用结束----------");
long s4 = System.currentTimeMillis();
System.out.println("分线程占用时间:" + (s4 - s3));
} catch (Exception e) {
e.printStackTrace();
}
}
});
t1.start();
long s = System.currentTimeMillis();
System.out.println("-----主线程占用中----------");
Singleton.getSigleton().getStr("M");
System.out.println("-----主线程占用结束----------");
long s2 = System.currentTimeMillis();
System.out.println("主线程占用时间:" + (s2 - s));
}
}
class Singleton {
private static Singleton s;
public String str = "你好";
public String getStr(String tName) throws Exception {
synchronized (Singleton.class) {
System.out.println(tName + "进入");
Thread.sleep(1000);
System.out.println(tName + "结束");
}
return str;
}
private Singleton() {
System.out.println("A Singleton Model example");
}
public static Singleton getSigleton() {
if (s == null)
s = new Singleton();
return s;
}
}
运行结果。
-
-----主线程占用中----------
-----分线程占用中----------
A Singleton Model example
A Singleton Model example
M进入
M结束
-----主线程占用结束----------
F进入
主线程占用时间:1002
F结束
-----分线程占用结束----------
分线程占用时间:2006
解析:M为主线程,F为分线程,str为资源,不论M线程还是F线程,进入方法getStr当中都会休眠1000毫秒,使用synchronized 将方法锁住,有且仅有一个线程可以操作getStr方法,此时不论哪个线程先进入,那么都会在方法中等待1秒后在出来,于是M线程进入,休眠一秒。而F进程在等待M线程运行完毕,等待时间1秒,然后进入getStr方法休眠1秒,于是M线程有1秒休眠,F线程等待加休眠时间一共2秒