黑马程序员技术交流社区
标题:
给数组中添加数据,每一个线程为数组添加3个数据
[打印本页]
作者:
www851903307
时间:
2015-2-25 20:39
标题:
给数组中添加数据,每一个线程为数组添加3个数据
/**
* 声明一个共享数组,起两个线程,两个线程分别隔一段时间(可以写一个随机数),
* 给数组中添加数据,每一个线程为数组添加3个数据即可。
* @author Administrator
*
*/
public class Thread2{
public static void main(String[] args) {
String[] share = new String[6];
Arr t2 = new Arr(share);
Thread t = new Thread(t2);
Thread t1 = new Thread(t2);
t.start();
t1.start();
for (String string : share) {
System.out.println(string);
}
}
}
class Arr implements Runnable {
public boolean flag= true;
private String[] share = new String[6];
public Arr(String[] share) {
this.share= share;
}
@Override
public void run() {
int num=0;
synchronized (share) {
for (int i = 0; i < 3; i++) {
num++;
share[num]= Thread.currentThread().getName()+i+"///";
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
请教大神,为啥我数组中有三个元素为null。。。应该怎么写
作者:
liaohongjie
时间:
2015-2-25 20:45
这个我看看,研究研究!!!!!
作者:
fantacyleo
时间:
2015-2-25 20:52
本帖最后由 fantacyleo 于 2015-2-25 20:55 编辑
因为每个线程进入run()运行时,num都从0开始,所以你始终只为share数组的0-2元素赋值,3-5元素始终是null。解决方法之一是把num这个变量拿出来作为静态变量而不是run()的局部变量
作者:
wf111sxwf
时间:
2015-2-25 22:12
3楼正解, 还有就是, 你在主线程中 要先将 线程1和线程2执行完 才能执行主线程 要不 你还是会打印出Null来, 提示 :用join方法
作者:
sofeel
时间:
2015-2-26 01:31
楼上2位正解。
我改过了代码附上
package pre;
/**
* 声明一个共享数组,起两个线程,两个线程分别隔一段时间(可以写一个随机数),
* 给数组中添加数据,每一个线程为数组添加3个数据即可。
* @author Administrator
*
*/
public class Thread2{
/*
* 两点说明:
* 1,有可能:主线程开始打印了,子线程没开始或没执行完。导致有空项。
* 2,run方法由两个线程调用,他们的共享数据num应在成员位置。
* */
public static void main(String[] args) {
String[] share = new String[6];
Arr t2 = new Arr(share);
Thread t = new Thread(t2);
Thread t1 = new Thread(t2);
t.start();
t1.start();
try {
Thread.sleep(100);
//打印
for (String string : share) {
System.out.println(string);
}
} catch (InterruptedException e) {e.printStackTrace();}
}
}
class Arr implements Runnable {
public boolean flag= true;
private String[] share;
private int num;
public Arr(String[] share) {
this.share= share;
}
@Override
public void run() {
synchronized (share) {
//添加
for (int i = 0; i < 3; i++) {
share[num++]= Thread.currentThread().getName()+i+"///";
}
try {
Thread.sleep(100);
} catch (InterruptedException e) { e.printStackTrace(); }
}
}
}
复制代码
作者:
sofeel
时间:
2015-2-26 01:33
fantacyleo 发表于 2015-2-25 20:52
因为每个线程进入run()运行时,num都从0开始,所以你始终只为share数组的0-2元素赋值,3-5元素始终是null。 ...
static不可取,设为普通成员就行
作者:
万合天宜
时间:
2015-2-26 09:02
将变量设置成共享数据就可以了~加static容易产生安全问题,应该是这样的~
作者:
jiangwenjun
时间:
2015-2-26 12:13
你的String[] 每个元素默认为null 你只循环了i<3,当然只给前3个复制了!后面三个都没有改变!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2