黑马程序员技术交流社区
标题:
多线程问题
[打印本页]
作者:
遗忘
时间:
2014-12-19 13:49
标题:
多线程问题
本帖最后由 遗忘 于 2014-12-26 10:02 编辑
下面是我自己的的代码, 感觉有些麻烦,有没有更简单的?
import java.util.Random;
public class ShareArrayDemo {
/**
* 声明一个共享数组,起两个线程,两个线程分别隔一段时间(可以写一个随机数),
* 给数组中添加数据,每一个线程为数组添加3个数据即可。
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//获取拥有数组的对象
final ShareArray shareArray = ShareArray.getInstance();
//创建线程
Thread tA = new Thread(new Runnable(){
public void run(){
for (int i = 0; i < 3; i++) {
shareArray.addInfoFirst();
}
}
});
Thread tB = new Thread(new Runnable(){
public void run(){
for (int i = 0; i < 3; i++) {
shareArray.addInfoSecond();
}
}
});
//给线程命名
tA.setName("线程A");
tB.setName("线程B");
//开启线程并运行
tA.start();
tB.start();
}
}
//因为数组是共享数据,设计为单例
class ShareArray{
private static ShareArray arr = null;
private ShareArray(){}
//定义数组
private String[] strs = new String[6];
//定义线程等待标记
private boolean flag = true;
//定义标记,用于接收每个线程给数组添加元素的个数
private int count1 = 1,count2 =1;
public static ShareArray getInstance() {
if(arr == null)
{
synchronized(ShareArray.class){
if (arr==null) {
arr = new ShareArray();
}
}
}
return arr;
}
//显示数组元素信息
public void showArrayInfo()
{
System.out.println("此时数组中元素列表:");
for (int i = 0; i < strs.length; i++) {
System.out.println("角标:"+i+":"+ strs[i]);
}
}
//第一个线程添加元素方法
public synchronized void addInfoFirst(){
//判断标记
while (!flag) {
try {
this.wait();
} catch (Exception e) {
// TODO: handle exception
}
}
//遍历数组 ,如果数组该角标位元素值不为null,则添加元素并退出循环,否则进行下一次循环;
for (int i = 0; i < strs.length; i++) {
if (strs[i]==null) {
strs[i] = Thread.currentThread().getName()+
"添加的第"+ count1+"个元素";
System.out.println(Thread.currentThread().getName()+
"给数组添加的第"+(i+1)+"个元素:"+ strs[i]);
//显示当前数组元素信息
showArrayInfo();
//记录添加元素的个数加一
count1++;
break;
}else
continue;
}
try {
//让两个线程随机时间间隔执行
Thread.sleep((new Random().nextInt(100)+1)*100);
} catch (Exception e) {
// TODO: handle exception
}
//修改标记
flag = false;
//唤醒线程
this.notify();
}
//第二个线程添加数组元素的方法
public synchronized void addInfoSecond(){
while (flag) {
try {
this.wait();
} catch (Exception e) {
// TODO: handle exception
}
}
for (int i = 0; i < strs.length; i++) {
if (strs[i]==null) {
strs[i] = Thread.currentThread().getName()+
"添加的第"+ count2+"个元素";
System.out.println(Thread.currentThread().getName()+
"给数组添加的第"+(i+1)+"个元素:"+ strs[i]);
showArrayInfo();
count2++;
break;
}else
continue;
}
try {
Thread.sleep((new Random().nextInt(100)+1)*100);
} catch (Exception e) {
// TODO: handle exception
}
flag = true;
this.notify();
}
}
复制代码
作者:
duluhua
时间:
2014-12-19 14:20
好多。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2