黑马程序员 java中的多线程

多线程
Java中实现多线程有两种方法: 1、继承Thread类,覆盖run()方法:使用Thread子类创建线程的优点是可以在子类中增加新的成员变量或方法,使线程具有某种属性或功能。但Java不支持多继承,Thread类的子类不能再扩展其他的类。
方法一:继承Thread类,覆盖方法run();

我们在创建的Thread类的子类中重写run(),加入线程所要执行的代码即可
Age一:
package abnormal;

public class Demo extend Thread {

public  void run(){
 for (int i = 0; i <60; i++) {
  System.out.println("demo run---"+i);
 }
}
   public  static class ThreadDemo{
 public static void main(String[] args) {
  Demo d=new Demo();
  d.start();
    for (int j = 0; j < 60; j++) {
  System.out.println("Hello world!······"+j);

 }
  }
}
方法步骤:
①、定义类继承Thread
②、复用Thread类中的run方法
③、调用线程start方法该方法两个作用启动线程调用run方法
Age二:
package keywords;

public class MyThread {
   int count=1,number;
   public MyThread(int num){
    number=num;
   System.out.println("创建线程"+number);
   }
   public void run(){
    while(true){
     System.out.println("线程"+number+"计数"+count);
     if(++count==6)return;
    }
   }
 public static void main(String[] args) {
  for(int i=0;i<5;i++)new MyThread(i+1).start();

 }

}
2、实现Runnable接口:用Thread类直接创建线程对象,使用构造函数Thread(Runnable target)(参数target是一个Runnable接口),创建线程对象时必须向构造方法参数传递一个实现Runnable接口类的实例,该实例对象称作所创线程的目标对象。当线程调用start()方法,一旦轮到它使用CPU资源,目标对象自动调用接口中的run()方法(接口回调)。
 线程间可以共享相同的内存单元(包括代码和数据),并利用这些共享单元来实现数据交换、实时通信与必要的同步操作。对于Thread(Runnable target)创建的使用同一目标对象的线程,可以共享该目标对象的成员变量和方法。 另外,创建目标对象类在必要时还可以是某个特定类的子类,因此,使用Runnable接口比使用Thread的子类更具有灵活性。 (注意:具有相同目标对象的线程,run()方法中的局部变量相互独立,互不干扰) 在线程中启动其他线程,当线程调用start()方法启动,使之从新建态进入就绪队列,一旦得到CPU资源就脱离创建它的主线程,开始自己的生命周期。
Java提供了接口java.lang.Runnable来支持这种方法
  package abnormal;

public class MyThread implements Runnable {
int count=1,number;
public MyThread(int num){
 number=num;
 System.out.println("创建线程"+number);
}
public void run(){
 while(true){
  System.out.println("线程"+number+"计数"+count);
  if(++count==6)return;
 }
}
 public static void main(String[] args) {
 for(int i=0;i<5;i++)new Thread(new MyThread(i+1)).start();

 }
}
线程的状态与生命周期: Java使用java.lang.Thread类及其子类的对象表示线程,新建的线程在它的一个完整生命周期中通常要经历如下四种状态:(新建、运行、(中断/挂起/阻塞)、消亡) 1、新建: 当一个Thread类或其子类对象被声明并创建,新生的线程对象就处于新建状态(此时它已经有了内存空间和其他资源)。  2、运行: 线程已经创建就具备了运行的条件,一旦轮到它来享用CPU资源时,即JVM将CPU使用权切换给该线程时,此线程就可以脱离创建它的主线程独立开始自己的生命周期了。 线程创建后仅仅是占有了内存资源,在JVM管理的线程中还没有这个线程,此线程必须调用start()方法(从父类继承)通知JVM,这样JVM就知道又有一个新的线程排队等候切换。
 当JVM将CPU使用权切换给线程时,如果线程是Thread的子类创建的,该类中的run()方法立刻执行(run()方法中规定了该线程的具体使命)。Thread类中的run()方法没有具体内容,程序要在Thread类的子类中重写run()方法覆盖父类该方法。(注意:在线程没有结束run()方法前,不要再调用start方法,否则将发生ILLegalThreadStateException异常)
3、挂起: 线程挂起的原因有一下四种: (1)、JVM将CPU资源从当前线程切换给其他线程,使本线程让出CPU的使用权,并处于挂起状态。 (2)、线程使用CPU资源期间,执行了sleep(int millsecond)方法,使当前线程进入休眠状态。sleep(int millsecond)方法是Thread类中的一个类方法,线程执行该方法就立刻让出CPU使用权,进入挂起状态。经过参数millsecond指定的毫秒数之后,该线程就重新进到线程队列中排队等待CPU资源,然后从中断处继续运行。 (3)、线程使用CPU资源期间,执行了wait()方法,使得当前线程进入等待状态。等待状态的线程不会主动进入线程队列等待CPU资源,必须由其他线程调用notify()方法通知它,才能让该线程从新进入到线程队列中排队等待CPU资源,以便从中断处继续运行。 (4)、线程使用CPU资源期间,执行某个操作进入阻塞状态,如执行读/写操作引起阻塞。进入阻塞状态时线程不能进入线程队列,只有引起阻塞的原因消除时,线程才能进入到线程队列排队等待CPU资源,以便从中断处继续运行。  4、死亡: 死亡状态就是线程释放了实体,即释放了分配给线程对象的内存。线程死亡的原因有两个: (1)、正常运行的线程完成了它的全部工作,即执行完run()方法中的全部语句,结束了run()方法。 (2)、线程被提前强制性终止,即强制run()方法结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值