多线程

一、进程与线程基本概念

  进程:进程是程序的一次动态执行过程,它经历了从代码加载,执行到执行完毕的一整个过程;

  线程:线程可以看作是轻量级的进程,是进程中负责程序执行的执行单元,本身依靠程序而运行;

二、线程的生命周期

  图片来自:Java多线程

  

  线程共有五种基本状态:

  新建态(New):刚创建的线程对象处于新建态;

  就绪态(Runnable):线程对象调用Thread类中的start()方法,线程进入就绪态,做好执行准备,等待CPU的调度;

  运行态(Running):CPU调用处于就绪态的线程,线程开始执行,进入运行状态,处于其他状态的线程必须先转换为就绪态后才能进入到运行状态;

  阻塞态(Blocked):处于运行态的线程因为某些原因停止执行,进入阻塞态;

  死亡态(Dead):线程执行完毕或强行退出,生命周期结束;

三、线程的实现方式

  1、继承Thread类  

 1 class MyThread extends Thread{    
 2     private String name ;
 3     public MyThread(String name){
 4         this.name = name;
 5     }
 6     @Override
 7     public void run() {
 8         for(int i = 0 ; i<100 ; i++){
 9             System.out.println(this.name + "--------->"+i);
10         }
11     }    
12 }

  启动线程要使用Thread类中的start()方法而不是调用run()方法,run()方法用来定义线程的运行体,若直接调用run()方法,相当于在main()线程中执行run()方法,并没有创建新的线程,使用start()方法启动线程是通过JVM调用run()方法,会创建一个新的线程;

  注:一个线程只能调用一次start()方法(只能启动一次),若调用多次会出现异常:java.lang.IllegalThreadStateException

  2、实现Runnable接口

 1 package com.thread;
 2 
 3 class MyThread implements Runnable{    
 4     private String name ;
 5     public MyThread(String name){
 6         this.name = name;
 7     }
 8     @Override
 9     public void run() {
10         for(int i = 0 ; i<100 ; i++){
11             System.out.println(this.name + "--------->"+i);
12         }
13     }    
14 }
15 
16 public class ThreadDemo {
17     public static void main(String[] args) {
18         MyThread mt = new MyThread("这是一个线程A:");
19         new Thread(mt).start();
20 //        Thread t1 = new Thread(mt);
21 //        t1.start();
22         new Thread(mt).start();
23 //        Thread t2 = new Thread(mt);
24 //        t2.start();
25         
26     }
27 }

  Runable接口中只有run()方法,继承Runnable接口实现多线程必须通过Thread类来启动start()方法,也就是将实现了Runnable接口类的实例传入Thread创建新的线程,再调用start()方法;

  

四、线程命名与取得

  Thread类中提供了setName()、getName()方法为线程命名或取得线程名称;若实例化线程对象的时候没有为其命名,系统会自动命名;

    |-  线程命名:public final String getName();

    |-  取得命名:public final void setName(String name);

    |-  返回当前正在执行对象的引用:public static Thread currentThread();

 1 package com.thread;
 2 
 3 class MyThread implements Runnable{    
 4     @Override
 5     public void run() {
 6         for(int i = 0 ; i<50 ; i++){
 7             System.out.println(Thread.currentThread().getName() + "--------->"+i);
 8         }
 9     }    
10 }
11 
12 public class ThreadDemo {
13     public static void main(String[] args) {
14         MyThread mt = new MyThread();
15         new Thread(mt,"线程A").start();
16         new Thread(mt,"线程B").start();
17         Thread t = new Thread(mt);
18         t.setName("线程C");
19         t.start();
20         
21     }
22 }
View Code

五、线程中方法

  |-- 线程休眠  public static void sleep(long millis) throws InterruptedException

    sleep()方法会让当前线程休眠一定时间,等待CPU调度,不会释放对象锁;

  |-- 线程优先级

    设置线程优先级:public final void setPriority(int newPriority)

    取得线程优先级:public final int getPriority()

      最低优先级:public static final int MIN_PRIORITY = 1;

      中间优先级:public static final int NORM_PRIORITY = 5;

      最高优先级:public static final int MAX_PRIORITY = 10;

     优先级高的线程不一定比优先级低的线程先执行,只是尽可能的让优先级高的先执行;

  |-- 等待线程结束   public final void join() throws InterruptedException

    当前对象会等待调用对象执行完毕后再执行

  |-- 暂停当前对象   public static void yield()

    当前对象让出CPU,等待其他线程先执行,当前对象进入就绪态等待;

    

设置线程优先级:

posted @ 2018-01-11 11:49  六色  阅读(99)  评论(0)    收藏  举报