1、写代码,思想很重要
2、如果实现状态转,线程唤醒时,使用while更好,可以防止伪唤醒
一道面试题:
子线程执行10次,然后主线程执行100次,如此交替50次
实现代码如下
public class TroditionalThreadCom {
public static void main(String[] args) {
final Busness bus = new Busness();
new Thread(new Runnable() {
@Override
public void run() {
for(int i = 1;i<50;i++){
bus.sub();
}
}
}).start();
for(int i = 1;i<50;i++){
bus.main();
}
}
}
public class Busness {
private Boolean flag = true;
public synchronized void sub() {
if(!flag){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int i =1;i<10;i++){
System.out.println("sub"+Thread.currentThread().getName());
}
flag = false;
this.notify();
}
public synchronized void main() {
if(flag){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int i =1;i<100;i++){
System.out.println("main thread"+Thread.currentThread().getName());
}
flag=true;
this.notify();
}
}
public class ThreadScopeShareData {
private static int data = 0;
private static Map<Thread, Integer> threadData = new HashMap<Thread, Integer>();
public static void main(String[] args) {
for(int i=0;i<2;i++){
new Thread(new Runnable(){
@Override
public void run() {
int data = new Random().nextInt();
System.out.println(Thread.currentThread().getName()
+ " has put data :" + data);
threadData.put(Thread.currentThread(), data);
new A().get();
new B().get();
}
}).start();
}
}
static class A{
public void get(){
int data = threadData.get(Thread.currentThread());
System.out.println("A from " + Thread.currentThread().getName()
+ " get data :" + data);
}
}
static class B{
public void get(){
int data = threadData.get(Thread.currentThread());
System.out.println("B from " + Thread.currentThread().getName()
+ " get data :" + data);
}
}
}
还可以使用java提供的类ThreadLocal
public class ThreadLoclTest {
private static ThreadLocal<Integer> x = new ThreadLocal<Integer>();
public static void main(String[] args) {
for(int i =0;i<2;i++){
new Thread(new Runnable() {
@Override
public void run() {
int data = new Random().nextInt();
System.out.println(Thread.currentThread().getName()
+ " has put data :" + data);
x.set(data);
new A().get();
new B().get();
}
}).start();
}
}
static class A{
public void get(){
int data = x.get();
System.out.println("A from " + Thread.currentThread().getName()
+ " get data :" + data);
}
}
static class B{
public void get(){
int data = x.get();
System.out.println("B from " + Thread.currentThread().getName()
+ " get data :" + data);
}
}
}