您的位置:首页 > 职场人生

黑马程序员——Java基础---线程的另一个总结(4)--线程通信(互斥),线程范围的共享变量

2015-07-03 22:28 716 查看
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();

}
}


想要每个线程使用自己个子线程数据,为每一个线程创建map并赋值,调用每一个线程时,使用对应线程map中的值
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);
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: