Java多線程第二節-線程的基本使用

1.線程中經常使用的方法介紹java

CLASS:Thread類【java.lang.Thread】git

INTERFACE:Runnable【java.lang.Runnable】github

裏面都有一個方法,由於Thread也實現了Runnable接口多線程

public abstract void run();//Runnable
@Override
public void run() {//Thread
    if (target != null) {
        target.run();
    }
}

 

CLASS:Thread類【java.lang.Thread】經常使用方法ide

1.線程的建立(構造函數)函數

    a:    Thread()spa

    b:    Thread(String name)線程

    c:    Thread(Runnable target)blog

    d:    Thread(Runnable target,String name)繼承

2.線程裏面的方法

    a:    void start()    啓動線程

    b:    static void sleep(Long millis)    線程休眠

    c:    static void sleep(Long millis,int nanos)    線程休眠

    d:    void join()    使其餘線程等待當前線程終止    不帶參數說明全部線程都進行等待

    e:    void join(Long millis)    使其餘線程等待當前線程終止    帶參數說明其餘線程最長鬚要等待的時候

    f:    void join(Long millis,int nanos)    使其餘線程等待當前線程終止    帶參數說明其餘線程最長鬚要等待的時候

    g:    static void yield()    當前運行線程釋放資源

    h:    static Thread currentThread()    返回當前運行的線程引用

2.線程的基本實現

    場景:我是農村人,我媽媽是一個節儉的人。雖然如今條件好了,我媽媽不要幹農活了,可是我媽媽在幫我姐姐帶小孩的時候還每天去旁邊的服裝廠剪線頭,我聽媽媽說,服裝廠來活的時候員工們都搶着去拿服裝,搶貨,由於是記件的,因此搶得越多賺的就越多,咱們就來模擬這樣一個場景。

第一種方式

package com.example.learning.多線程;

/**
 * 描述:
 * User: 曾遠征
 * Date: 2018-09-17
 * Time: 21:02
 */
public class EmployeeAThread extends Thread {//第一種方式,繼承Thread

    @Override
    public void run() {//重寫run方法
        System.out.println(getName()+"我是一個員工");
        int count=0;

        boolean isBoolean=true;
        while (isBoolean){
            System.out.println(getName()+"我在拿貨,拿了"+(++count)+"件");
            if (count==100){
                isBoolean=false;
            }

            if (count%5==0){
                try {
                    sleep(3000);//休息3秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println(getName()+"我拿完貨了");
    }

    public static void main(String[] args) {
        Thread thread=new EmployeeAThread();
        thread.setName("大金牙");
        thread.start();
    }
}

 

第二種方式 

package com.example.learning.多線程;

/**
 * 描述:
 * User: 曾遠征
 * Date: 2018-09-17
 * Time: 21:15
 */
public class EmployeeBRunnable implements Runnable {//實現Runnable接口

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"我是一個員工");
        int count=0;

        boolean isBoolean=true;
        while (isBoolean){
            System.out.println(Thread.currentThread().getName()+"我在拿貨,拿了"+(++count)+"件");
            if (count==100){
                isBoolean=false;
            }

            if (count%5==0){
                try {
                    Thread.sleep(3000);//休息3秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println(Thread.currentThread().getName()+"我拿完貨了");
    }

    public static void main(String[] args) {
        Thread thread=new Thread(new EmployeeBRunnable(),"小金牙");
        thread.start();
    }
}

 

 兩個線程一塊兒運行

package com.example.learning.多線程;

/**
 * 描述:兩個線程一塊兒執行
 * User: 曾遠征
 * Date: 2018-09-17
 * Time: 21:19
 */
public class EmployeeABMain {

    public static void main(String[] args) {
        Thread threadA=new EmployeeAThread();
        threadA.setName("大金牙");
        threadA.start();
        Thread threadB=new Thread(new EmployeeBRunnable(),"小金牙");
        threadB.start();
    }
}

 

結果返回

 

兩個線程交替運行,爲何不是一塊兒執行呢?由於在同一個時間,同一個處理器,只能運行一個線程,但一個線程運行完時才能運行另一個線程

以上示例在githun地址:

https://github.com/ant-zengyz/Learning/tree/master/src/main/java/com/example/learning/%E5%A4%9A%E7%BA%BF%E7%A8%8B 

 

3.稍微深刻的實現線程

package com.example.learning.多線程.多線程模擬2;

/**
 * 描述:
 * User: 曾遠征
 * Date: 2018-09-17
 * Time: 21:41
 */
public class EmployeeRunnable implements Runnable {

    //volatile保證了線程能夠正確的讀取其餘線程寫入的值,爲何volatile能夠保證,哈哈,我也不懂,可是我知道這樣作是能夠的,大家百度吧
    volatile boolean isBoolean=true;

    @Override
    public void run() {
        while (isBoolean){
            for (int i = 0; i < 3; i++) {
                System.out.println(Thread.currentThread().getName()+"我在拿貨,拿了"+i+"件");
                //讓出處理器時間,下次哪條線程執行仍是未知數
                Thread.yield();
            }
        }
        System.out.println(Thread.currentThread().getName()+"我拿完貨了");
    }
}
package com.example.learning.多線程.多線程模擬2;

/**
 * 描述:
 * User: 曾遠征
 * Date: 2018-09-17
 * Time: 21:46
 */
public class FactoryThread extends Thread {

    @Override
    public void run() {//重寫run方法

        EmployeeRunnable djy=new EmployeeRunnable();
        EmployeeRunnable xjy=new EmployeeRunnable();
        Thread djyThread=new Thread(djy,"大金牙");
        Thread xjyThread=new Thread(xjy,"小金牙");

        djyThread.start();
        xjyThread.start();

        //主線程中止,讓子線程執行
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //讓線程中止
        djy.isBoolean=false;
        xjy.isBoolean=false;

        try {
            xjyThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new FactoryThread().start();
    }
}

 

執行結果

 

能夠看到,有的時候是一人一次執行,有的時候是一個線程連續執行,爲何呢?由於Thread.yield()方法

3.再次稍微的深刻的實現線程(接上一版本進行改造添加)

package com.example.learning.多線程.多線程模擬3;

/**
 * 描述:
 * User: 曾遠征
 * Date: 2018-09-17
 * Time: 21:41
 */
public class EmployeeDPZRunnable implements Runnable {


    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"我在拿貨");
        for (int i = 0; i < 10 ; i++) {
            System.out.println(Thread.currentThread().getName()+"仗着本身胖,拼命拿貨");
        }
        System.out.println(Thread.currentThread().getName()+"我拿完貨了");
    }
}
package com.example.learning.多線程.多線程模擬3;

/**
 * 描述:
 * User: 曾遠征
 * Date: 2018-09-17
 * Time: 21:46
 */
public class FactoryThread extends Thread {

    @Override
    public void run() {//重寫run方法

        EmployeeRunnable djy=new EmployeeRunnable();
        EmployeeRunnable xjy=new EmployeeRunnable();
        Thread djyThread=new Thread(djy,"大金牙");
        Thread xjyThread=new Thread(xjy,"小金牙");

        djyThread.start();
        xjyThread.start();

        //主線程中止,讓子線程執行
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        Thread dpzThread=new Thread(new EmployeeDPZRunnable(),"大胖子");

        //讓線程中止
        djy.isBoolean=false;
        xjy.isBoolean=false;

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        dpzThread.start();

        //等待線程執行完成
        try {
            dpzThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("結束了");
    }

    public static void main(String[] args) {
        new FactoryThread().start();
    }
}

輸出結果

這裏有一個關鍵方法join(),主線程會等待子線程執行完時纔會執行

這裏主要就是幾個關鍵的方法的實現,sleep 和 yield 還有 join的用法

列子都在上面的github地址裏面,謝謝

相關文章
相關標籤/搜索