Java多线程之多线程工程代码编写思维方式
生活随笔
收集整理的這篇文章主要介紹了
Java多线程之多线程工程代码编写思维方式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Java之多線程的工程代碼編寫思維方式
題目:三個售票員賣出30張票,用線程模擬。
前言:
-
本文涉及synchronized、Lock和拉姆達表達式(Lambda Expressions),前兩知識點推薦看這兩篇寫的很好的詳解文章。
-
Java并發編程:synchronized
-
Java并發編程:Lock
多線程技巧口訣:
未優化的代碼:
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;class Ticket {private int number = 30; //模擬票數private int num = 1;public synchronized void sale() {if (number > 0) {System.out.println(Thread.currentThread().getName() + "\t賣出第:" + (num++)+ "張,還剩下:" + --number);}} }public class ThreadDemo4 {public static void main(String[] args) {Ticket ticket = new Ticket();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i < 40; i++) {ticket.sale();}}}, "A").start();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i < 40; i++) {ticket.sale();}}}, "B").start();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i < 40; i++) {ticket.sale();}}}, "C").start();} }結果部分截圖:
利用拉姆達表達式(Lambda Expressions)和Lock對代碼進行優化。
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;class Ticket {private int number = 30; //模擬票數private Lock lock = new ReentrantLock();private int num = 1;public void sale() {lock.lock();try {if (number > 0) {System.out.println(Thread.currentThread().getName() + "\t賣出第:" + (num++) + "張,還剩下:" + --number);}} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}} }public class ThreadDemo1 {public static void main(String[] args) {Ticket ticket = new Ticket();new Thread(() -> {for (int i = 1; i < 40; i++) {ticket.sale();} }, "A").start();new Thread(() -> {for (int i = 1; i < 40; i++) {ticket.sale();} }, "B").start();new Thread(() -> {for (int i = 1; i < 40; i++) {ticket.sale();} }, "C").start();} }---結果部分截圖:
帶著技巧口訣去一邊看一邊理解,很重要!
總結
以上是生活随笔為你收集整理的Java多线程之多线程工程代码编写思维方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java基础之代码执行顺序深入解析
- 下一篇: java美元兑换,(Java实现) 美元