天天看点

JAVA多线程基础一、进程与多线程的概念二、线程的启动三、线程安全四、停止线程五、暂停线程 六、线程的优先级七、线程5种状态及转换

一、进程与多线程的概念

    进程:操作系统管理的基本运行单位,可以理解为运行在内存中的exe文件

    线程:进程中运行的独立子任务

    多线程的目的:提升cpu的利用率

二、线程的启动

    2.1、继承thead类,实现run方法

      1.使用多线程技术时,代码的运行结果与执行顺序或调用顺序无关的

      2.调用start方法是通知线程规划器,此线程已准备就绪;

      3.执行start方法并不代表线程启动的顺序。

public class MyThread extends Thread {
    public void run() {  
        System.out.println("MyThread.run()");  
    }  
}  
MyThread myThread1 = new MyThread();  
myThread1.start();  
           

   2.2、 实现runnable接口,重写run方法  

     1.使用runnable打破java单根继承的局限性

     2.Thread类也实现了runnable接口,这意味着Thread对象中的run方法可以交由其他线程调

public class MyThread extends OtherClass implements Runnable {  
    public void run() {  
        System.out.println("MyThread.run()");  
    }  
}  

           

此处用用的是静态代理模式:

目标角色:MyThread

代理角色:Thread

接口:Runnable

目标角色、代理角色共同实现Runnable接口,并且代理角色中拥有目标角色的引用。

三、线程安全

    实例变量与线程安全   

   1.非线程安全:多个线程同时访问同一个对象的同一个实例变量,导致数据改变,值不同步。

   2.sychronized关键字:可以在任意对象和方法上加锁,解决非线程安全。

四、停止线程

    线程停止的三种方法          

   1.run方法执行完后线程终止;

   2.使用stop方法强行终止线程,但此方法已作废,原因:一方面强制让线程停止则可能一些清理性的工作得不到完成,另一方         面 对锁定的对象释放了锁,导致数据不同步引发线程安全。

   3.使用interrupt方法中断线程:

      3.1interrupt + 异常

      3.1interrupt + return

     建议用异常

    判断线程是否是停止状态    

    1.this.interrupt();仅仅是在当前线程中打了一个停止的标记,并不是真的停止线程;

    2.this.interrupted();测试当前线程是否已经是中断状态,执行后具有将状态标志清除为false的功能;

    3.this.isinterrupted();测试线程Thread对象是否已经中断状态,但不清除状态标志

    在沉睡中停止

    1.沉睡中停止会抛异常;

    2.在停止中沉睡也会抛异常

五、暂停线程

    suspend与resume配合使用

    1.suspend方法暂停线程,resume·方法恢复线程的执行;

    2.suspend与resume方法的缺点:

    2.1极易造成公共的同步对象独占,使其他线程无法访问公共同步对象;

    2.2容易出现线程暂停而导致数据不同步现象

    yiled方法

    yiled()方法的作用是放弃当前占用的cpu'资源,但放弃的时间不确定,可能马上活动cpu时间片

六、线程的优先级

1.线程优先级高的线程得到cpu的资源多;

2.设置线程优先级有助于线程规划器确定下一次选择哪个线程来执行

    线程优先级具有继承性

    线程的优先级有规则     

    1.高优先级的显线程总是大部分先执行完,但不代表优先级高的线程全部执行完,才执行优先级低的线程

    2.线程优先级的规则是:cpu尽量将执行资源让给优先级比较高的线程

    守护线程

    1.java线程有两种,一种是用户线程,另一种是守护线程;

    2.守护线程,当用户线程执行完毕,守护线程自动销毁,典型的守护线程就是垃圾回收站;

七、线程5种状态及转换

JAVA多线程基础一、进程与多线程的概念二、线程的启动三、线程安全四、停止线程五、暂停线程 六、线程的优先级七、线程5种状态及转换

Java语言定义了线程5种状态,在任意一个时间点,一个线程只能有且只有其中一种状态:

新建(New):当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时仅由JVM为其分配内存,并初始化其成员变量的值。

运行(Runable):当线程对象调用了start()方法之后,该线程处于就绪状态。Java虚拟机会为其创建方法调用栈和程序计数器,等待调度运行。。

运行状态(RUNNING):如果处于就绪状态的线程获得了CPU,开始执行run()方法的线程执行体,则该线程处于运行状态。

阻塞(Blocked):线程被阻塞了,“阻塞状态”与“等待状态”的区别是:“阻塞状态”在等待获取一个排它锁,这个事件将在另外一个线程放弃这个锁的时候发生;“等待状态”则是在等待一段时间,或者唤醒动作的发生。在程序进入等待进入同步块区域的时候,线程将进入这种状态。

阻塞的情况分三种:

等待阻塞(o.wait->等待对列):运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。

同步阻塞(lock->锁池):运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。

其他阻塞(sleep/join):运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。

结束(Terminated):已终止线程的线程状态,线程已经结束执行。

正常结束

1.run()或call()方法执行完成,线程正常结束。

异常结束

2.线程抛出一个未捕获的Exception或Error。

调用stop

3.直接调用该线程的stop()方法来结束该线程—该方法通常容易导致死锁,不推荐使用。

继续阅读