1. 程式人生 > >執行緒--簡單多執行緒通訊例項

執行緒--簡單多執行緒通訊例項

1、多執行緒通訊

兩個執行緒同時操作一個儲存空間,一個存資料,一讀資料。並且按照一定的順序輪流執行。Object提供wait(),notify(),notify All(),方法用於解決執行緒間通訊問題。

1.1、程式碼
package com.example;


public class MyThreadCommit {
    public static void main (String [] args){

    Storage st = new Storage();//建立資料儲存類物件
    Input input = new Input(st);//建立Input 物件傳入Storage物件
Output output = new Output(st);//建立傳入Storage物件 new Thread(input).start(); new Thread(output).start(); } } class Input implements Runnable{ //輸入執行緒 private Storage st; private int num; //定義一個變數 Input(Storage st){ //通過構造方法來接受一個Storage物件 this.st=st; } public
void run(){ while (true){ st.put(num++); //將num存入陣列,每次存入後 +1 } } } class Output implements Runnable{//輸出執行緒類 private Storage st; Output(Storage st){ this.st=st; //構造方法接受一個Storage 物件 } public void run(){ while(true){ st.get(); //迴圈取出元素
} } } class Storage { private int [] cells = new int[10]; //資料儲存陣列 private int inPos,outPos;//inPos 存入時的陣列下標,outPos取出時的陣列下標 private int count; //存入或取出時資料的數量 public synchronized void put(int num){ try { while (count == cells.length){ this.wait(); } cells[inPos]=num;//向陣列中放入資料 System.out.println("在cells["+inPos+"]中放入資料---"+cells[inPos]); inPos++; //存完元素讓位置加1 if (inPos == cells.length){ inPos = 0; //當cells[9]放完資料後再從cells[0]開始 } count ++; //每方一個數據count 加1 this.notify(); } catch (InterruptedException e) { e.printStackTrace(); } } public synchronized void get(){ try { while (count == 0) { //如果count為0,此執行緒等待 this.wait(); } int data = cells[outPos];//從陣列中取出資料 System.out.println("在cells["+outPos+"]中取出資料---"+data); cells[outPos]=0;//當取出資料時,當前資料值為0 outPos++;//取萬後位置+1 if(outPos == cells.length){ outPos=0;//當從cells[9]中取完資料後再從cells[0]開始 } count--;//每取一個元素count -1 this.notify(); } catch (InterruptedException e) { e.printStackTrace(); } } }
1.2、執行結果

在cells[2]中放入資料---3759862
在cells[3]中放入資料---3759863
在cells[4]中放入資料---3759864
在cells[5]中放入資料---3759865
在cells[6]中放入資料---3759866
在cells[7]中放入資料---3759867
在cells[8]中放入資料---3759868
在cells[9]中放入資料---3759869
在cells[0]中放入資料---3759870
在cells[1]中取出資料---3759861
在cells[2]中取出資料---3759862
在cells[3]中取出資料---3759863
在cells[4]中取出資料---3759864
在cells[5]中取出資料---3759865
在cells[6]中取出資料---3759866
在cells[7]中取出資料---3759867
在cells[8]中取出資料---3759868
在cells[9]中取出資料---3759869
在cells[0]中取出資料---3759870
在cells[1]中放入資料---3759871
在cells[2]中放入資料---3759872
在cells[3]中放入資料---3759873
在cells[4]中放入資料---3759874

首先使用synchorized關鍵字將put()方法和get()方法修飾為同步方法,之後每操作一次資料,便呼叫一次notify()方法喚醒 對應同步鎖上等待的執行緒。
當存入資料時,如果count的值和cells陣列的長度相等,說明陣列已經填滿,此時呼叫同步鎖的wait()方法使存入資料的執行緒進入等待狀態。
當取出資料時,如果count的值為0,說明陣列已經被取空,此時就需要呼叫同步鎖的wait()方法,使取出資料的執行緒進入等待狀態。

參考文件:
Java基礎入門 傳智部落格高教產品研發部 

本人鄭重宣告,本部落格所著文章、圖片版權歸權利人持有,本博只做學習交流分享所用,不做任何商業用途。訪問者可將本博提供的內容或服務用於個人學習、研究或欣賞,不得用於商業使用。同時,訪問者應遵守著作權法及其他相關法律的規定,不得侵犯相關權利人的合法權利;如果用於商業用途,須徵得相關權利人的書面授權。若以上文章、圖片的原作者不願意在此展示內容,請及時通知在下,將及時予以刪除。

相關推薦

執行簡單執行通訊例項

1、多執行緒通訊 兩個執行緒同時操作一個儲存空間,一個存資料,一讀資料。並且按照一定的順序輪流執行。Object提供wait(),notify(),notify All(),方法用於解決執行緒間通訊問題。 1.1、程式碼 package com.e

libevent原始碼分析鎖和執行

寫在前面: ​ 這個原始碼是分析libevent-2.0.20-stable, 並非最新版本的libevent,作者並沒有全看原始碼,在這裡會推薦以下參考的一些網站,也歡迎大家在不足的地方提出來進行討論。 鎖 ​ libevent的內部實現不需要多執行緒,

簡單執行示例

#include<Windows.h> #include<iostream> using namespace std; DWORD WINAPI Fun1Proc(LPVOID lpParameter);//定義執行緒入口函式(規定格式) DWORD WINAP

【go語言 socket程式設計系列】從單執行簡單執行的服務端搭建

簡單單執行緒serverdemo 通過下面程式碼簡單搭建一個服務端,並通過telnet模擬客戶端,演示多客戶端同時請求訪問單執行緒伺服器時的阻塞現象。 package main import ( "fmt" "net" "os" ) func main() {

非同步程式設計學習之路(一)-通過Thread實現簡單執行

自上週主管帶我看過kafka內部實現,使用Feature來做的資料批量傳送之後,自此決定要學好併發程式設計。 因為本人在多執行緒上只能說是一個新手,打算從最底層的Thread一步一步記錄我的學習之路。 通過Thread實現多執行緒的方式有兩種,程式碼如下: 一、多執行緒實現(繼承Thre

C++簡單執行事件驅動同步通知到主執行

#include <iostream> #include <assert.h> #include <queue> #include <string> #include <Windows.h> #include &l

簡單執行爬蟲+Jsoup分析

使用簡單多執行緒和Jsoup分析,得到CSDN的首頁的所有子網頁連線。 執行效果如下圖 --------------------------------------------------------------------------------------------

簡單執行執行任務

當幾個任務需要同時進行時,這就用到了多執行緒程式設計。簡單多執行緒的一個很好的例子為: new Thread((new Runnable(){ @Override public void run(){ //你要執行的程式碼 } }))

【精】【執行】ListenableFuture非同步執行查詢實現

  業務場景:為優化查詢效率,將原有查詢的條件做成單獨的索引表,每次產生記錄就會同步到索引表中,每次查詢索引表,根據索引便利的條件欄位再分別查詢每張子表的內容,最後封裝成前臺要的實體類。這裡面涉及到非同步查詢,如何保證一條記錄下的子表全部都查出來後才執行下面的操作。 下面Demo簡

32-執行--概述+Thread類+執行的建立方式(繼承Thread類+實現Runnable介面)+Runnable介面+執行的名稱+執行的狀態

一、概述 1、程序:對應的是一個應用程式在記憶體中的所屬空間。程序是不直接執行的,它只是在分配該應用程式的記憶體空間 注:如果一個程式在記憶體中開闢了空間,就代表它在執行。不執行要釋放空間 2、執行緒:程序中的一個負責程式執行的控制單元,也叫執行路徑。一個程序中可以有多個執行路徑,稱之為

執行的弊端,執行基礎學習

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using

python執行———2、建立執行的兩種方式

 法一、使用Thread類例項化 法二、繼承Thread來實現多執行緒 #對於io操作來說,多執行緒和多程序效能差別不大 #1、使用Thread類例項化 import time import threading def get_detail_html(url): prin

linux執行基礎概念及執行程式設計

Linux中執行緒的概念: 首先,Linux中並不存在真在的執行緒。Linux中的執行緒是使用程序來模擬的。在一個程序需要同時執行多個執行流時,linux並不是開闢多個執行緒來執行,而是通過多個程序來模擬多個執行緒。 Linux中執行緒的實現原理: 首先先看一下張圖: 此時共有

執行(二):執行開啟方式與執行(threading模組)

目錄 執行緒的建立Threading.Thread類 1)執行緒的建立 2)多執行緒與多程序 3)Thread類的其他方法 4)守護執行緒 multiprocess模組的完全模仿了threading模組的介面,二者在使用層面,有很大的相似性,因而不再詳細介紹(官方連結)

執行學習-day-01執行基礎

執行緒基礎、執行緒之間的共享和協作 (目前會將一些概念簡單描述,一些重點的點會詳細描述) 1,CPU核心數和執行緒數之間的關係 ①、一塊CPU只有一塊處理器 ②、Inter提出了多核處理器 ③、CPU核心數 和 執行緒數 是 1:1 的關係 ④、Inter提出了超執行緒,

執行第五課——執行引發的問題及解決方案

  這節課我們來學習下多執行緒可能引發的問題以及解決方法     先來看一個小例子: public class MultiThreadDemo {     public static void main(String[]

執行第三課——執行初探與執行的生命週期

  這節課我們來進入多執行緒,來初步感受下多執行緒,並瞭解下執行緒的宣告週期   Demo 01: public static void main(String[] args) {     //直接點,懶得想新的執行緒名了 &nb

[Xcode10 實際操作]八、網路與執行-(22)使用GCD執行技術非同步下載圖片

本文將演示如何使用使用GCD多執行緒技術非同步下載圖片。 Grand Central Dispatch(GCD) 是 Apple 開發的一個多核程式設計的較新的解決方法。 它主要用於優化應用程式以支援多核處理器以及其他對稱多處理系統。 它是一個線上程池模式的基礎上執行的併發任務。 在 Mac OS X

Java執行執行安全,開啟執行及每執行迴圈10次對類進行輸出測試

最近看到執行緒問題,emmm~腦闊回想到計算機作業系統貌似又講,不過上課睡覺覺去啦哈哈哈,java課老師莫得講~ 然歸正傳,今對執行緒進行查閱及測試,做一下筆記,有錯之處還請指出,謝謝~上程式碼之前呢先說一哈前傳 執行緒是程序中的最小執行單位:    手機呢會有很多單獨

python高階(二)——工(一)執行(2)執行UDP聊天器

import socket import threading def recv_msg(udp_socket): # 接收資料 while True: recv_data = udp_socket.recvfrom(1024) print(recv