1. 程式人生 > >Java中的執行緒同步跟定時任務

Java中的執行緒同步跟定時任務

執行緒的同步

  • 在一般情況下,建立一個執行緒是不能提高程式的執行效率的,所以要建立多個執行緒。但是多個執行緒同時執行的時候可能呼叫執行緒函式,在多個執行緒同時對同一個記憶體地址進行寫入,由於CPU時間排程上的問題,寫入資料會被多次的覆蓋,所以就要使執行緒同步。

  • 執行緒同步:即當有一個執行緒在對記憶體進行操作時,其他執行緒都不可以對這個記憶體地址進行操作,直到該執行緒完成操作, 其他執行緒才能對該記憶體地址進行操作,而其他執行緒又處於等待狀態,目前實現執行緒同步的方法有很多,臨界區物件就是其中一種。



摘自百度百科

同步的三種常用方法

1、同步程式碼塊

  • 有synchronized關鍵字修飾的語句塊



程式碼如:


    synchronized(object){ 
    }

被該關鍵字修飾的語句塊會自動被加上內建鎖,從而實現同步


例項:

/**
 * 執行緒的同步
 * @author LingDu
 */
public class Demo1 extends Thread {

    //定義一個可共享的count
    private static int count = 0;

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            try
{ Thread.sleep(1000); test1(); } catch (InterruptedException e) { e.printStackTrace(); } } } // 預設建構函式 public Demo1() { super(); } // 帶引數的建構函式 public Demo1(String name) { super(name); } /** * 使用同步程式碼塊 */
public void test1() { synchronized (Demo1.class) { System.out.println(Thread.currentThread().getName() + "--->" + count); count = count + 1; } } public static void main(String[] args) { Demo1 demo1 = new Demo1("執行緒1"); Demo1 demo2 = new Demo1("執行緒2"); Demo1 demo3 = new Demo1("執行緒3"); Demo1 demo4 = new Demo1("執行緒4"); demo1.start(); demo2.start(); demo3.start(); demo4.start(); } }

1

2、同步方法

  • 有synchronized關鍵字修飾的方法

程式碼如:

public synchronized void save(){}

由於java的每個物件都有一個內建鎖,當用此關鍵字修飾方法時,內建鎖會保護整個方法。在呼叫該方法前,需要獲得內建鎖,否則就處於阻塞狀態。

/**
 * 執行緒的同步
 * @author LingDu
 */
public class Demo1 extends Thread {

    //定義一個可共享的count
    private static int count = 0;

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            try {
                Thread.sleep(1000);
                test2();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    // 預設建構函式
    public Demo1() {
        super();
    }

    // 帶引數的建構函式
    public Demo1(String name) {
        super(name);
    }


    /**
     * 使用同步方法
     */
    public synchronized static void test2() {
        System.out.println(Thread.currentThread().getName() + "--->" + count);
        count = count + 1;
    }

    public static void main(String[] args) {
        Demo1 demo1 = new Demo1("執行緒1");
        Demo1 demo2 = new Demo1("執行緒2");
        Demo1 demo3 = new Demo1("執行緒3");
        Demo1 demo4 = new Demo1("執行緒4");

        demo1.start();
        demo2.start();
        demo3.start();
        demo4.start();
    }
}

2

3、使用特殊域變數(volatile)實現執行緒同步

  • 用volatile修飾的變數,執行緒在每次使用變數的時候,都會讀取變數修改後的最的值。
public class Demo2 extends Thread {

    //定義一個狀態,用來控制執行緒
    private volatile boolean sign = true;

    public boolean isSign() {
        return sign;
    }

    public void setSign(boolean sign) {
        this.sign = sign;
    }

    public Demo2() {
        super();
    }

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

    @Override
    public void run() {
        // 迴圈10000次 ,模擬一個非常耗時的工作
        for (int i = 0; i < 10000; i++) {
            try {
                Thread.sleep(1000);
                if (sign == true) {
                    System.out.println(Thread.currentThread().getName() + "," + i);
                } else {
                    System.out.println(this.getName() + "我的狀態變了,我要退出了");
                    Thread.sleep(10000);
                    break;
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        // 一個名字叫main的執行緒
        Demo2 d1 = new Demo2();
        Demo2 d2 = new Demo2();
        d1.start();
        d2.start();
        // 讓兩個執行緒都去執行5秒
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //d1執行緒退出
        d1.setSign(false);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //d2執行緒退出
        d2.setSign(false);

    }

}

3

Timer類


構造方法

  • Timer() 建立一個新計時器。

  • Timer(boolean isDaemon) 建立一個新計時器,可以指定其相關的執行緒作為守護程式執行。

  • Timer(String name) 建立一個新計時器,其相關的執行緒具有指定的名稱。

  • Timer(String name, boolean isDaemon) 建立一個新計時器,其相關的執行緒具有指定的名稱,並且可以指定作為守護程式執行。


常用的方法:

  • Void schedule(TimerTask task, long delay, long period) 安排指定的任務從指定的延遲後開始進行重複的固定延遲執行。

1、 內部類的方式實現

/**
     * 建立一個定時任務
     * 內部類方式實現
     * 建立一個類TimeTaskDemo繼承TimerTask,重寫run方法
     */
    public static void test1(){
        //內部類方式實現
        class TimeTaskDemo extends TimerTask{

            @Override
            public void run() {
                System.out.println("1");

            }
        }
        Timer timer = new Timer();
        //schedule(TimerTask task, long delay, long period)
        // 這裡的0表示立即執行 , 1000表示每1秒執行一次
        timer.schedule(new TimeTaskDemo(), 0,1000);
    }

4

2、 匿名內部類實現

/**
     * 匿名內部類實現
     */
    public static void test2(){

        Timer timer = new Timer();
        //new一個TimerTask()重寫
        timer.schedule(new TimerTask() {

            @Override
            public void run() {
                System.out.println("2");

            }
        }, 0,1000);
    }

5

相關推薦

Java執行同步定時任務

執行緒的同步 在一般情況下,建立一個執行緒是不能提高程式的執行效率的,所以要建立多個執行緒。但是多個執行緒同時執行的時候可能呼叫執行緒函式,在多個執行緒同時對同一個記憶體地址進行寫入,由於CPU時間

java執行同步的幾種方法

方法一: 使用synchronized關鍵字  由於java的每個物件都有一個內建鎖,當用此關鍵字修飾方法時, 內建鎖會保護整個方法。在呼叫該方法前,需要獲得內建鎖,否則就處於阻塞狀態。 注: synchronized關鍵字也可以修飾靜態方法,此時如果呼叫該靜態方法,將會

JAVA執行同步的方法(7種)彙總

同步的方法: 一、同步方法   即有synchronized關鍵字修飾的方法。 由於java的每個物件都有一個內建鎖,當用此關鍵字修飾方法時, 內建鎖會保護整個方法。在呼叫該方法前,需要獲得內建鎖,否則就處於阻塞狀態。 注: synchronized關鍵字也可以修飾靜態

java執行同步的理解(非常通俗易懂)

Java中執行緒同步的理解 我們可以在計算機上執行各種計算機軟體程式。每一個執行的程式可能包括多個獨立執行的執行緒(Thread)。 執行緒(Thread)是一份獨立執行的程式,有自己專用的執行棧。執行緒有可能和其他執行緒共享一些資源,比如,記憶體,檔案,資料庫等。

java執行同步Synchronized,監視器monitor和鎖lock的關係是什

既然有關監視器monitor的概念比較難,大家怎麼解釋的都有。首先我給出一下java的官方文件,也是最權威的解釋: Synchronizationis built around an internal entity known as the intrinsic lock ormonitor lock. (Th

Java執行同步非同步、以及執行的安全

  什麼是執行緒同步?     這裡的“同”是協同的意思,並不是共同。那麼就很好理解同步了,就是一起操作但並不是同時操作。比如流水線組裝汽車,可以視作一個執行緒,只有裝好了上一步的門,才可以裝下一步的門窗玻璃。沒有裝門能裝上玻璃嗎?顯然不行。所以執

java執行與高併發庫應用(二)執行建立和定時任務Timer

1、建立執行緒的兩種方式, 通過start, 執行run方法。 第一種實現runnable, 定義類實現Runnable介面 重寫Runnable介面中的run方法 通過Thread建立執行緒物件 將Runnable介面的子類物件作為實際引數傳遞

Java執行同步同步程式碼塊、wait、notify與notifyAll的真正含義與工作原理

今天在和導師討論Java多執行緒程式設計的同步問題時,發現自己對同步程式碼塊、wait()方法、notify()方法和notifyAll()方法的理解不太清晰,於是在網上查閱資料,可是結果眾說紛紜,又在

java執行同步

ThreadLocal與其它同步機制的比較: Threadlocal和其他所有的同步機制都是為了解決多執行緒中的對同一變數的訪問衝突。 在普通的同步機制中,是通過對物件加鎖來實現多個執行緒對同一變數的安全訪問的。這時該變數是多個執行緒共享的,使用這種同步機制需要很細緻的分析在什麼時候對變數進

java執行同步

            執行緒屬性: 1.執行緒優先順序,   優先順序高度依賴於系統,不要讓程式的正確性依賴於優先順序。預設情況子執行緒會繼承父執行緒的優先順序。 2.守護執行緒,   唯一用途是為其他執行緒提供服務,當只剩

沉澱再出發:java執行池解析

沉澱再出發:java中執行緒池解析 一、前言    在多執行緒執行的環境之中,如果執行緒執行的時間短但是啟動的執行緒又非常多,執行緒運轉的時間基本上浪費在了建立和銷燬上面,因此有沒有一種方式能夠讓一個執行緒執行完自己的任務之後又被重複使用呢?執行緒池的出現就是為了解決這個問題。到了現在

Java執行池基本api及其作用

1.執行緒池相關的類 2.重要類的api及其方法 Executors.newCachedThreadPool() 建立一個可快取的執行緒池 Executors.newSingleThreadExecutor();建立一個只有一個執行緒執行的 不可修改的執行緒池  

Java執行安全的單例模式

Java中執行緒安全的單例 深入研究Servlet執行緒安全性問題 來源:網路整理 作者:2017年12月01日 14:03 0 分享 訂閱 關鍵詞:Servlet執行緒     Servlet(Server Applet)是Java Servle

java synchronize - 執行同步原理

Java支援同步機制的是Monitor。Monitor就像是擁有一個特殊房間的建築,在同一時間裡,這間特殊的房間只能被一個執行緒擁有。 enter the monitor:進入這幢建築 acquiring the monitor:進入建築裡的特殊房間 owning the monitor:擁有

java執行池的生命週期

執行緒池生命週期包括: RUNNING:接收新的任務並處理佇列中的任務 SHUTDOWN:不接收新的任務,但是處理佇列中的任務 STOP:不接收新的任務,不處理佇列中的任務,同時中斷處理中的任務 TIDYING:所有的任務處理完成,有效的執行緒數是0 TERMINATED:termin

Java執行池,你真的會用嗎

轉載自   Java中執行緒池,你真的會用嗎 在《深入原始碼分析Java執行緒池的實現原理》這篇文章中,我們介紹過了Java中執行緒池的常見用法以及基本原理。 在文中有這樣一段描述: 可以通過Executors靜態工廠構建執行緒池,但一般不建議這樣使用。 關於這個

JAVA執行到底起到什麼作用!

這是javaeye上非常經典的關於執行緒的帖子,寫的非常通俗易懂的,適合任何讀計算機的同學. 執行緒同步 我們可以在計算機上執行各種計算機軟體程式。每一個執行的程式可能包括多個獨立執行的執行緒(Thread)。 執行緒(Thread)是一份獨立執行的程式,有自己專用的執行棧。執行緒有可能和其他執行緒

java synchronize - 執行同步機制

Java支援同步機制的是Monitor。Monitor就像是擁有一個特殊房間的建築,在同一時間裡,這間特殊的房間只能被一個執行緒擁有。 enter the monitor:進入這幢建築 acquiring the monitor:進入建築裡的特殊房間 owning t

java執行池的生命週期與執行中斷

執行緒池生命週期包括: RUNNING:接收新的任務並處理佇列中的任務 SHUTDOWN:不接收新的任務,但是處理佇列中的任務 STOP:不接收新的任務,不處理佇列中的任務,同時中斷處理中的任務 TIDYING:所有的任務處理完成,有效的執行緒數是0 TE

java執行安全和非執行安全的集合

  執行緒安全 非執行緒安全 Collection Vector ArrayList、LinkedList   H