Thread和Runnable之间的关系

public class Thread implements Runnable{

  private Runnable target;

//Thread实现Runnable接口,但是并没有完全实现run() 方法,此方法是Runnable子类完成的,所以如果继承Thread就必须覆写run方法

@Override

 public void run(){

  if(!target != null){

    target.run();

  }

 }

}


---------------------------------------Runnable 接口---------------------------

public interface Runnable{

  public abstract void run();

}


===================================================================================

一个类继承Thread,不适合多个线程共享资源,实现Runnable接口,可以方便实现资源共享

因为一个线程只能启动一次,通过Thread实现线程时,线程和线程所要执行的任务是捆绑在一起的。也就使得一个任务只能启动一个线程,不同的线程执行的任务是不相同的,所以没有必要,也不能让两个线程共享彼此任务中的资源。

一个任务可以启动多个线程,通过Runnable方式实现的线程,实际是开辟一个线程,将任务传递进去,由此线程执行。可以实例化多个 Thread对象,将同一任务传递进去,也就是一个任务可以启动多个线程来执行它。这些线程执行的是同一个任务,所以他们的资源是共享。

两种不同的线程实现方式本身就决定了其是否能进行资源共享。


任何线程生命周期: 创建(构造函数 Thread td = new Thread())——就绪(线程队列)—运行(cpu调度,获取处理器资源)——阻塞(正常运行时,sleep,suspend,wait()或者处理时间长,不能进入排队队列,只有阻塞原因消失才能进入排队队列进入就绪状态)——死亡(stop或者run函数运行结束,不具有继续运行能力)


主线程有可能比其他线程先执行完,因为线程操作的不确定性,所以主线程有可能最先执行完,那么其他线程不会受到任何影响,并不会随着主线程的消失而消失

class MyThread implements Runnable {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName() + "i:" + i);
}
}
}


public class ThreadAliveDemo extends Thread {


public static void main(String[] args) {
Runnable re = new MyThread();
Thread td = new Thread(re, "线程:");
System.out.println("线程启动之前:" + td.isAlive());
td.start();
System.out.println("线程启动之后:" + td.isAlive());
for (int i = 0; i < 3; i++) {
System.out.println("main运行:" + i);
}
        System.out.println("代码运行之后:" + td.isAlive());
}
最后不确定,可能false,可能true

}

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YZWDNN/article/details/51540178
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭