首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

刚接触多线程,有点晕,请问一下

2012-01-23 
刚接触多线程,有点晕,请教一下importjava.util.ArrayListclassRimplementsRunnable{privateintiArrayLis

刚接触多线程,有点晕,请教一下
import   java.util.ArrayList;
class   R   implements   Runnable   {
private   int   i;
ArrayList   a   =   new   ArrayList();
public   int   getI()   {
return   i;
}
public   void   setI(int   i)   {
this.i   =   i;
}
public   void   run()   {
//synchronized   (a)   {
a.add(i);
//}
}
public   ArrayList   getA()   {
return   a;
}
public   void   setA(ArrayList   a)   {
this.a   =   a;
}
}

import   java.util.ArrayList;

public   class   Test   {
public   static   void   main(String[]   args)   throws   Exception   {
long   a1   =   System.currentTimeMillis();
R   r=   new   R();
Thread   t=new   Thread(r);
//r.setI(9);
for(int   i=0;i <100;i++){
r.setI(i);
System.out.println( "t== "+i);
t.start();
t.sleep(1000);
}
ArrayList   l   =   r.getA();
for(int   i=0;i <l.size();i++){
System.out.println(l.get(i));
}
long   b1   =   System.currentTimeMillis();
System.out.println(b1-a1);
}
}

请问为什么产生Exception   in   thread   "main "   java.lang.IllegalThreadStateException
at   java.lang.Thread.start(Thread.java:571)
at   Test.main(Test.java:15)
我该怎么修改呢?谢谢

[解决办法]
一个线程怎么能启动很多次呢

你在循环里面调用 t.start(); 肯定会报错


[解决办法]


import java.util.ArrayList;

class R implements Runnable {
private int i;

ArrayList a = new ArrayList();

public int getI() {
return i;
}

public void setI(int i) {
this.i = i;
}

public void run() {
for (int ii = 0; ii < 100; ii++) {

a.add(i);
this.setI(ii);
System.out.println( "t== " + i);
try {
Thread.sleep(100);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}

public ArrayList getA() {
return a;
}

public void setA(ArrayList a) {
this.a = a;
}
}

public class Test2 {
public static void main(String[] args) throws Exception {
long a1 = System.currentTimeMillis();
R r = new R();
Thread t = new Thread(r);
t.start();
ArrayList l = r.getA();

}
}

[解决办法]
不太明白你
的意思

[解决办法]
同意楼上兄弟
同一个线程不能启动多次,不过你可以在MAIN里启动多个线程
看了你发出的代码,给你做了如下修改,如果没有理解错误的话应该是能实现你原有功能的
package com.philwong.therd;

import java.util.ArrayList;

public class R implements Runnable {

private int i;
ArrayList a = new ArrayList();
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public void run() {
//synchronized (a) {
a.add(i);
//}
}
public ArrayList getA() {
return a;
}
public void setA(ArrayList a) {


this.a = a;
}

}

下面是MAIN方法,注意我改动的地方!
public class Test {
public static void main(String[] args) throws Exception {
long a1 = System.currentTimeMillis();
R r= new R();
//注意这个地方 Thread t=new Thread(r);//你原来创建线程对像是在这里,我把它移到循环里面了。
//r.setI(9);
for(int i=0;i <100;i++){
Thread t=new Thread(r);//移至此处就可以开起多个线程
r.setI(i);
System.out.println( "t== "+r.getI());
t.start();
t.sleep(1000);
}
ArrayList l = r.getA();
for(int i=0;i <l.size();i++){
System.out.println(l.get(i));
}
long b1 = System.currentTimeMillis();
System.out.println(b1-a1);
}
}
[解决办法]
如果你只是用线程来玩玩可以实现,要是在实际中运用还没有递归来的实在
不管是代码可读性还是持行方面都比线程效果好。

热点排行