做作业的第二题总结出几种方法:
1、创建类的一个变量,有几个线程对象,变量就是几,然后在run()方法里的try{}catch(InterruptedException e){}语句后面添上一个finally{synchronized(this){this.变量名--;}};这样来锁定,当每次执行时都会执行finally,从而变量一直减,当变量减到0时,然后再run()里面的最后再添加一个判断if(类名.变量名==0){输出线程运行完毕!}我觉得这个适合多个线程对象还有同步线程 !
2、在main() 主函数里面最后写上一个循环,使条件永真,循环里有一个判断语句,判断对象的getStatc()是否等于线程结束状态Thread.State.TERMINATEED,如果等于就输出线程运行完毕!并且跳出循环,当然这种只适合对象比较少的情况。
3、也是在main()函数里写上一个try{}catch(InterruptedException e){}语句.直接在try里面写上Thread.sleep(time);time是比最长时间的线程都大于等于的;这样保证他们都执行完以后,再监视一下线程的状态,当然不确定时间的话就填上一个永真循环,跟上面第2种方法一样;
4、还有一种不符合编程的方法,虽然不符合,但是也能成功,就是直接在run()函数里的try{}catch(InterruptedException e){}语句后面添上一个判断语句,看线程的时间是否等于最长时间,当然这种是要前提下知道最长时间的;这个就不太适合用 了。
另外附于我写的一个例子:
class A implements Runnable{
String str;
int delay;
static int n=0;
public A(String str,int delay){
this.str=str;
this.delay=delay;
}
public static void main(String[] args) {
Thread t1=new Thread(new A("A类对象1",1000));
t1.start();
Thread t2=new Thread(new A("B类对象1",2000));
t2.start();
try {
Thread.sleep(2000);
if(t1.getState()==Thread.State.TERMINATED&&t2.getState()==Thread.State.TERMINATED){
System.out.println("线程运行完毕 !");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
public void run() {
try {
Thread.sleep(delay);
System.out.println(str + "\t休眠时间为:" + delay);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
好就先总结到这儿吧!不知道我写的你是否都看懂.