因为今天看到一道笔试题目,就是怎么确保多线程不发生死锁问题,个人认为要确保多线程不发生死锁的办法就是让线程有序的操作资源,当然我也不知道对不对,如果网友发现有错,欢迎指出把。我当时想到的就是使用join方法使用,然后就发现自己以前就是知道join方法可以使主线程停止知道子线程执行完毕。具体怎么实现怎么操作还是不清楚,于是自己写了一段简单的代码测试了一下,理解了一下,希望对大家有帮助,当然还是那句毕竟是初学者,可能有错误的理解希望大家指出,废话不多说附上代码
public class Test1 {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
//这里是实现Runnable接口创建一个线程的方法,即有该类的对象创建一个Thread类的对象
ThreadTest tt=new ThreadTest();
Thread t=new Thread(tt);
//这里是继承Thread类的方法创建一个线程,就是简单的创建一个对象
ThreadTest1 t1=new ThreadTest1();
ThreadTest2 t2=new ThreadTest2();
t.start();
//此时t线程调用join方法,则使得其他线程停止,先执行完t线程再去执行其他线程t1和t2线程
//t.join();
//此时t1线程调用join方法,则使得其他线程停止,先执行完t1线程再去执行其他线程t和t2线程
t1.start();
t1.join();
//此时t2线程调用join方法,则使得其他线程停止,先执行完t2线程再去执行其他线程t和t1线程,这里注意前面会执行前面t和t1的部分代码,因为当程序读到join方法前已经执行了一段时间,之前的执行顺序完全由系统自己决定
t2.start();
//t2.join();
//这里总结一下,就是一旦某线程使用join()方法,会使程序停止其他线程而执行调用join方法的线程,可以理解join就是个插队的线程
//这里纯属就是实现下类的内部方法怎么调用类的内部私有属性,一时忘了就顺便实现下
tt.f(new ThreadTest());
}
}
//第一个线程,实现了Runnable接口,重写run方法
class ThreadTest implements Runnable{
private int a=0;
private int b=5;
public void run()
{
for(int i=0;i<100;i++)
{
a=a+i;
System.out.println(a);
}
}
public void f(ThreadTest tt)
{
System.out.println(tt.b);
}
}
//第二个线程,继承Thread类,然后重写run方法
class ThreadTest1 extends Thread{
private int f=11;
public void run()
{
for(int i=0;i<5;i++)
{
System.out.println(f);
}
}
}
//第三个线程,同样是实现了Thread类,然后重写run方法
class ThreadTest2 extends Thread{
private int c=99;
public void run()
{
for(int i=0;i<10;i++){
System.out.println(c);
}
}
}