记一次Java多线程的基本概念(one)

                              再爱不回头。可如果是你,那就让我回头下吧。

 

最近在项目中使用了多线程,初次体验效果还是很不错的,所以有有必要学习下和记录下,虽然以前是学过一段时间,但是主要是对付面试,就没有很深入的进入学习,所以这次是深入进去学习下多线程的。这篇文章主要就是记录下线程的基本信息。个人认为,多线程是我们必须学的,同时也是必须要学好的部分。

 

线程的状态说明 : 

1 : 新建状态(New) : 线程对象被创建后,就进入了新建状态。

  比如 : Thread trhead = new Thread(); 代码就是这样理解

 

2 : 就绪状态 (Runnable):  就绪状态也可以称为: 可执行状态。线程对象创建后,其他线程调用了该对象的start()方法,来启动线程.

 比如 : thread.start(); 就是主线程来调用thread对象的start方法,就是处理就绪状态,随时都可能被CPU调度执行.

 

3 : 运行状态 (Running): 线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。 

 

4 : 阻塞状态 (Blocked): 阻塞状态是线程因为某种原因放弃CPU使用权,暂停使用权,直到线程进入到就绪状态,才有机会转到运行状态.阻塞的状态有如下的几种 : 

    4.1 : 等待阻塞 :  -- 通过调用线程的wait()方法,让线程等待某工作的完成.

    4.2 : 同步阻塞 : 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。(synchronized会在后续说到,同一个对象,synchronized修改的多个方法,只有一个方法在同一时刻是可以调用的,其他的线程都会被阻塞起来,如果没synchronized修饰的方法就不会进行阻塞.)

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

 

5 : 死亡状态(Dead) : 线程执行完了或者因异常退出了run()方法,该线程结束了生命周期。

 

如下是线程状态的图片说明

 

2 : 实现线程的方法有

   2.1 : 直接继承Thread : 代码如下

   

package com.yang.create;

/***********************************************************************
 *<PRE>
 *
 *  File Name       :  创建线程的方式一 ;  继承Thread 实现run方法
 *
 *  Creation Date   : 19-9-12
 *
 *  Author          : Gavin
 *
 *  Purpose         : 
 *
 *  History         : 
 *
 *</PRE>
 ***************************************************************************/

public class CreateThreadFunctionOne extends Thread {

    public CreateThreadFunctionOne(String name){ super(name); }

    @Override
    public void run() {
        for(int i=0;i<20;i++){
            System.out.println(this.getName() + " : " + i);
        }
    }

    public static void main(String[] args) {

        for(int i=0;i<5;i++){
            new CreateThreadFunctionOne("Thread Number : " + i).start();
        }

    }
}

 

 2.2 实现 Runnable 接口 : 代码如下

    

package com.yang.create;

/***********************************************************************
 *<PRE>
 *
 *  File Name       : 创建线程方法二
 *
 *
 *  Creation Date   : 19-9-12
 *
 *  Author          : Gavin
 *
 *  Purpose         :  实现 Runnable接口,重写run方法
 *
 *  History         : 
 *
 *</PRE>
 ***************************************************************************/
public class CreateThreadFunctionTwo implements Runnable {


    @Override
    public void run() {

        for(int i=0;i<20;i++){
            System.out.println(Thread.currentThread().getName() + " Number : " + i);
        }

    }

    public static void main(String[] args) {

        for(int i=0;i<5;i++){
            CreateThreadFunctionTwo createThreadFunctionTwo = new CreateThreadFunctionTwo();
            new Thread(createThreadFunctionTwo,"thread : " + i).start();
        }

    }

}

 Thread 和 Runnable 的相同点:

都是实现多线程的方式

 

Thread 和 Runnable 不同点是 : 

Thread 是类,Runnable 是接口,Thread类本身是实现了Runnable 类的接口。

我们知道“一个类只能有一个父类,但是却能实现多个接口”,因此Runnable具有更好的扩展性。

此外,Runnable还可以用于“资源的共享”。即,多个线程都是基于某一个Runnable对象建立的,它们会共享Runnable对象上的资源。

通常,建议通过“Runnable”实现多线程!

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章