Java-多线程

来源:互联网 发布:手机九宫格软件 编辑:程序博客网 时间:2024/06/16 18:20

1. 继承Thread类

1. 创建类

这是类的声明部分,并继承自Thread线程类,在里面实现了线程的run()方法

public class SimpleThread extends Thread {      private int count = 5;      private int num ;      public SimpleThread(int _num) {        num=_num;        System.out.println("Thread: " + num);      }      //run()方法是在实现Thread类的过程中一定要实现的方法      public void run() {        while(true) {          System.out.println("Thread " +             num + "(" + count+ ")");          if(--count == 0) return;        }      }    }

2. 实例化类

这里我们实例化该类,并使用start() 方法启动线程

      public static void main(String[] args) {      //循环启动五个线程        for(int i = 1; i < 3; i++)      {          new SimpleThread(i).start();      }     }

3. 示例

上述示例结果为:
这里写图片描述
我们可以发现,运行的结果与我们定义的顺序并不一致,并不是

Thread 1Thread 1(5)Thread 1(4)Thread 1(3)Thread 1(2)Thread 1(1)Thread 2Thread 2(5)Thread 2(4)Thread 2(3)Thread 2(2)Thread 2(1)

这说明CPU处理一个现有线程集的顺序是不确定的。

2. 实现Runnable接口

1. 创建类

public class timerPrinter implements Runnable {    int pauseTime;    String name;    public timerPrinter(int x, String n) {        pauseTime = x;        name = n;    }    //run函数作为Runnable接口要实现出来    public void run() {        while(true) {            try {                System.out.println(name + ":" + new                     Date(System.currentTimeMillis()));                //实现线程的休眠                Thread.sleep(pauseTime);            } catch(Exception e) {                System.out.println(e);            }        }    }}

2. 实例化类

这里将当前类的实例作为Thread类的构造参数,以此创建线程对象

public static  void main(String args[]) {        //创建线程t1        Thread t1 = new Thread(new timerPrinter(1000, "Thread 1"));        t1.start();    }

3. 示例

这里写图片描述

注意:当使用runnable接口时,不能像继承Thread类那样直接创建所需对象并运行,必须从Thread类的一个实例内部运行。

线程 实例化方式 Thread new SimpleThread(i).start() Runnable Thread t1 = new Thread(new timerPrinter(1000, “Thread 1”));
t1.start();

3. 线程状态

1. 五种状态

  1. 新建状态:线程已经被创建但尚未执行(即未调用start()方法)
  2. 就绪状态:线程已经被创建(即已经处于新建状态)后,执行start()方法,该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
  3. 运行状态:就绪状态的线程获取了CPU,执行程序代码(即run()方法)
  4. 阻塞状态:程序因某种原因不会被分配CPU,无法继续运行。
  5. 死亡状态:线程run()方法执行完了或者因异常退出了run()方法,该线程结束生命周期

2. 阻塞详解

其中阻塞状态可以由下面5种原因导致:

  • 调用sleep(long millis),使线程进入睡眠状态。
  • 用suspend()暂停了线程的执行,除非收到resume()消息恢复。
  • 用wait()方法暂停了线程的执行,除非收到notify()或notifyAll()消息恢复。
  • 线程正在等待一些I/O操作。
  • 运行的线程在获取对象的同步锁,而该同步锁被别的线程占用。

3. 状态转换

这里写图片描述

0 0