程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> [javaSE] 並發編程(線程間通信),javase線程

[javaSE] 並發編程(線程間通信),javase線程

編輯:JAVA綜合教程

[javaSE] 並發編程(線程間通信),javase線程


新建一個資源類Resource

定義成員變量String name

定義成員變量int age

 

新建一個輸入類Input,實現Runnable接口

定義一個構造方法Input(),傳入參數:Resource對象

實現run()方法

定義while(true)往Resuorce對象的屬性賦值

 

 

新建一個輸出類Output,實現Runnable接口

定義一個構造方法Output(),傳入參數:Resource對象

實現run()方法

定義while(true)打印Resuorce對象的屬性

 

 

main方法中

獲取Resource對象,new出來

獲取Input對象,new出來,構造參數:Resource對象

獲取Output對象,new出來,構造參數:Resource對象

獲取Thread對象,new出來,構造參數:Runnable對象

調用Thread對象的start()方法,開啟線程

 

此時會有線程安全問題,查看結果可以發現,漢字和拼音的混了

陶士涵=====男

taoshihan=====nan

陶士涵=====nan

陶士涵=====nan

陶士涵=====男

陶士涵=====男

陶士涵=====nan

陶士涵=====nan

taoshihan=====nan

taoshihan=====nan

 

使用synchronized(){}同步代碼塊包裹操作同一個資源的地方

注意同步線程的個數,所有的線程都應該加上

注意是否是同一個鎖,synchronized()括號內的鎖參數:保證是個唯一的資源

使用synchronized(){}包裹上面的賦值和打印,鎖:Resource對象(唯一的)

 

查看結果,此時沒有安全問題

陶士涵=====男

陶士涵=====男

陶士涵=====男

taoshihan=====nan

taoshihan=====nan

taoshihan=====nan

 

死鎖問題:同步中嵌套同步,並且鎖不一致,此時會造成死鎖問題

/**
 * 資源
 * 
 * @author taoshihan
 * 
 */
class Resource {
    String name;
    String sex;
}

/**
 * 輸入
 * 
 * @author taoshihan
 * 
 */
class Input implements Runnable {
    private Resource resource;

    public Input(Resource resource) {
        this.resource = resource;
    }

    @Override
    public void run() {
        // 切換
        boolean flag = true;
        while (true) {
            synchronized (resource) {
                if (flag) {
                    resource.name = "taoshihan";
                    resource.sex = "nan";
                } else {
                    resource.name = "陶士涵";
                    resource.sex = "男";
                }
                flag = !flag;
            }
        }
    }

}

/**
 * 輸出
 * 
 * @author taoshihan
 * 
 */
class Output implements Runnable {
    private Resource resource;

    public Output(Resource resource) {
        this.resource = resource;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (resource) {
                System.out.println(resource.name + "=====" + resource.sex);
            }
        }
    }

}

public class InputOutputDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Resource resource = new Resource();
        Input input = new Input(resource);
        Output output = new Output(resource);

        Thread t1 = new Thread(input);
        Thread t2 = new Thread(output);
        t1.start();
        t2.start();
    }

}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved