package com.halei.test;
import java.util.Random;
public class ThreadTest extends Thread {
// 数组share索引
public int index = 0;
public static void main(String[] args) throws Exception {
// share用于保存2个线程添加的数据
String[] share = new String[6];
//为了提高方法的拓展性,定义数组放在了主函数中,而AddData类内创建该类引用,则可以访问该数组,这样就免除了要用单利设计模式的烦恼,就算创建多个AddData对象,也都是访问该数组
ThreadTest tt = new ThreadTest(); //主方法创建本类对象,后面要作为其他匿名类参数.
Thread t1 = new Thread(new AddData(share, tt), "线程A");
Thread t2 = new Thread(new AddData(share, tt), "线程B");
t1.start();
t2.start();
// 当2个线程执行完,才执行下面的main线程程序
//延长主线程生命周期,这样就确保了index伴随子线程一直存在并且唯一,下转51行,(this.share[tt.index++]在子线程中要一直访问index)
t1.join();
t2.join();
// 遍历share保存的数据
for (int i = 0; i < share.length; i++) {
//打印主线程名字和数组元素,其中数组元素包含子线程名字和String[] data = { "第一个数据", "第二个数据", "第三个数据" }中的数据
System.out.println(Thread.currentThread().getName() + "--"
+ share[i]);
}
}
}
class AddData implements Runnable {
private String[] share;
private ThreadTest tt;
public AddData(String[] share, ThreadTest tt) {
this.share = share;
this.tt = tt;
}
@Override
public void run() {
String[] data = { "第一个数据", "第二个数据", "第三个数据" };
synchronized (share) {
for (int i = 0; i < data.length; i++) {
//下面这段代码我怀疑是在实现存储动作的自然化,貌似没什么用......没看懂.健壮性?
/*try {
Thread.sleep((new Random().nextInt(10) + 1) * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
this.share[tt.index++] = Thread.currentThread().getName() + ":"
+ data[i];
}
}
}
}
___________________________________________________________________________________________
另外,怎么能像其他人那样把eclipse原样发到帖子上啊?
|
|