Java中的创建多线程的方法

来源:互联网 发布:红色报刊档案数据库 编辑:程序博客网 时间:2024/06/11 01:04

一、Java中多线程的生命周期

Java中的一个线程有5个状态:

1.新建状态(new):当线程被创建了,该线程就进入新建状态,如 Thread t= new Thread();

2.就绪状态(Runnable):当线程调用了start()方法,线程就进入就绪状态,如t.start( ),此时该线程不是马上执行,而是等待CPU分配资源调度;

3.运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就     绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;

4.阻塞状态(Blocked):处于运行中的线程,可能因为某些原因而放弃对CPU的使用,进入阻塞状态,直到该线程再次进入就绪状态(Runnable),才有机会被执行。阻塞状态有三种:

  (1)等待阻塞:执行wait( )方法,线程进入等待阻塞状态,等待notify( )进入同步阻塞状态,直到获得同步锁,重新进入就绪状态。

  (2)同步阻塞:线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态,直到获得同步锁,重新进入就绪状态;

  (3)其他阻塞:线程还有可能通过sleep( ) 或 join() 或 发出I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线      程重新转入就绪状态。

5.死亡状态(Dead):线程执行完毕,或因异常退出run( )方法,程序死亡。


二、Java中创建多线程主要有两种方法,一种是继承Thread类,一种是继承Runnable接口。下面创建一个猫类,让它的实体作为一个线程,在控制台上输出“Hello World”十次,输完停止该线程。


1.继承Thread类。

在main方法里面创建继承了Thread的类的实体c1,启动实体的线程,就是调用Thread类的start()函数,start将启用线程,并调用run()函数。

public class Demo1{

   public static void main(String[]args) {

      Cat c1=new Cat();

      c1.start();

   }

}

创建一个猫类,继承Thread类,复写run()方法,用while(true)循环执行线程。

class Cat extends Thread {

   int times=0;

   public void run() {

      while(ture) {

      try {

         Thread.sleep(1000);

      } catch (InteruptedException e) {

         e.printStackTrace();

      }


      System.out.println("Hello world!");

      times++;


      if(times==10)

         break;

      }

   }

}


2.用Runnable接口实现多线程。创建新的应用了Runnable接口的实体c2,在创建一个线程t,将该实体传入该线程,再将该线程启动。

public class Demo2 {

   public static void main(String[]args) {

      Cat c2=new Cat();

      Thread t=new Thread(c2);

      t.start();

   }

}

猫类应用了Runnable的接口,复写run()方法,写法和继承Thread类一样。

public class Cat implements Runnable {

   int times=0;

   public run() {

      whlile(true) {

         try {

            Thread.sleep(1000);

         } catch (InterruptedException e) {

            e.printStackTrace;

         }

      System.out.println("Hello World!");

      times++;


      if(times==10)

         break;

      }  

   }

}