日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java线程之基础学习

發布時間:2023/12/10 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java线程之基础学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?java線程之基礎學習總結?

線程實現的兩種方式:

java中可以有兩種方式實現多線程操作,一種是繼承Thread類,另外一種是實現Runnable接口。

繼承Thread

Thread類是在java.lang包中定義的

一個類只要繼承Thread類,要覆寫run()方法。

簡單實例

定義MyThread

  • 定義MyThread類?
  • public?class?MyThread?extends?Thread?{?
  • ????private?String?name;?
  • ????public?MyThread(String?name)?{?
  • ????????this.name?=?name;?
  • ????}?
  • ????public?void?run()?{?
  • ????????for?(int?i?=?0;?i?<?5;?i++)?{?
  • ????????????System.out.println(name?+?"運行:"?+?i);?
  • ????????}?
  • ????}?
  • }?
  • 編寫TestThread類調用:?

  • public?class?TestThread?{?
  • ????public?static?void?main(String[]?args)?{?
  • ????????MyThread?myThread1?=?new?MyThread("singsong1");?
  • ????????MyThread?myThread2?=?new?MyThread("singsong2");?
  • ????????myThread1.run();?
  • ????????myThread2.run();?
  • ????}?
  • }?
  • 運行結果:?
  • singsong1運行:0?
  • singsong1運行:1?
  • singsong1運行:2?
  • singsong1運行:3?
  • singsong1運行:4?
  • singsong2運行:0?
  • singsong2運行:1?
  • singsong2運行:2?
  • singsong2運行:3?
  • singsong2運行:4?
  • 從結果可以發現,此時的執行非常的有規律,先執行完第一個對象,再執行第二個對象。

    run()方法換成start();一旦調用start()方法,則會通過JVM找到run()方法

    Public void start()

    使用start()方法啟動線程:

  • public?class?TestThread?{?
  • ????public?static?void?main(String[]?args)?{?
  • ????????MyThread?myThread1?=?new?MyThread("singsong1");?
  • ????????MyThread?myThread2?=?new?MyThread("singsong2");?
  • ????????myThread1.start();?
  • ????????myThread2.start();?
  • ????}?
  • }?
  • 運行結果:?
  • singsong1運行:0?
  • singsong1運行:1?
  • singsong2運行:0?
  • singsong1運行:2?
  • singsong2運行:1?
  • singsong1運行:3?
  • singsong2運行:2?
  • singsong1運行:4?
  • singsong2運行:3?
  • singsong2運行:4?
  • 從運行結果可以知道,程序時交互式的運行。

    因為需要用到CPU的資源,所以每次的運行結果基本是都不一樣的

    不要調用Thread類或Runnable對象的run方法。直接調用run方法,只會執行同一個線程中的任務,而不會啟動新線程。應該調用Thread.start()方法。這個方法將創建一個執行run方法的新線程。


    Runnable接口的實現

    簡單實例

  • public?class?RunnableThread?implements?Runnable?{?
  • ????private?String?name;?
  • ????public?RunnableThread(String?name)?{?
  • ????????this.name?=?name;?
  • ????}?
  • ????public?void?run()?{?
  • ????????for?(int?i?=?0;?i?<?5;?i++)?{?
  • ????????????System.out.println(name?+?"運行:"?+?i);?
  • ????????}?
  • ????}?
  • }?
  • 編寫TestThread1調用?

  • public?class?TestThread1?{?
  • ????public?static?void?main(String[]?args)?{?
  • ?????????RunnableThread?runnableThread1=new?RunnableThread("singsong1");?
  • ?????????RunnableThread?runnableThread2=new?RunnableThread("singsong2");?
  • ????????Thread?thread1=?new?Thread(runnableThread1);?
  • ????????Thread?thread2=?new?Thread(runnableThread2);??????
  • ????????thread1.start();?
  • ????????thread2.start();??????????
  • ????}?
  • }?
  • ?
  • 運行結果:?
  • singsong1運行:0?
  • singsong1運行:1?
  • singsong2運行:0?
  • singsong2運行:1?
  • singsong2運行:2?
  • singsong2運行:3?
  • singsong2運行:4?
  • singsong1運行:2?
  • singsong1運行:3?
  • singsong1運行:4?

  • Thread類和Runnable接口區別

    最大區別是在于資源的共享

    如果一個類繼承Thread,則資源共享不可共享。而實現Runable接口,能實現資源共享。

    例如:

    MyThread

  • public?class?MyThread?extends?Thread?{?
  • ????private?int?ticket?=?5;?
  • ????private?String?name;?
  • ????public?MyThread(String?name)?{?
  • ????????this.name?=?name;?
  • ????}?
  • ????public?void?run()?{?
  • ????????for?(int?i?=?0;?i?<?15;?i++)?{?
  • ????????????if?(ticket?>?0)?{?
  • ????????????????System.out.println(name?+?"正售出第?"?+?(ticket--)?+?"票");?
  • ????????????}?
  • ????????}?
  • ????}?
  • }?
  • ?
  • 調用:?
  • public?class?TestThread?{?
  • ????public?static?void?main(String[]?args)?{?
  • ????????MyThread?myThread1?=?new?MyThread("singsong1");?
  • ????????MyThread?myThread2?=?new?MyThread("singsong2");?
  • ????????myThread1.start();?
  • ????????myThread2.start();?
  • ????}?
  • }?
  • 運行結果:?
  • singsong1正售出第?5票?
  • singsong1正售出第?4票?
  • singsong1正售出第?3票?
  • singsong1正售出第?2票?
  • singsong1正售出第?1票?
  • singsong2正售出第?5票?
  • singsong2正售出第?4票?
  • singsong2正售出第?3票?
  • singsong2正售出第?2票?
  • singsong2正售出第?1票?
  • 重復售出了一次

    再來看看Runnable接口是怎么實現資源共享的

    RunnableThread

  • public?class?RunnableThread?implements?Runnable?{?
  • ????private?int?ticket?=?5;?
  • ????private?String?name;?
  • ????public?RunnableThread(String?name)?{?
  • ????????this.name?=?name;?
  • ????}?
  • ????public?void?run()?{?
  • ????????for?(int?i?=?10;?i?>?0;?i--)?{?
  • ????????????if?(ticket?>?0)?{?
  • ????????????????System.out.println(name?+?"正售出第?"?+?(ticket--)?+?"票");?
  • ????????????}?
  • ????????}?
  • ????}?
  • }?
  • ?編寫TestThread1調用:

    ?
  • public?class?TestThread1?{?
  • ????public?static?void?main(String[]?args)?{?
  • ????????RunnableThread?runnableThread1?=?new?RunnableThread("singsong1");?
  • ????????Thread?thread1?=?new?Thread(runnableThread1);?
  • ????????Thread?thread2?=?new?Thread(runnableThread1);?
  • ????????thread1.start();?
  • ????????thread2.start();?
  • ????}?
  • }?
  • 運行結果:?
  • singsong1正售出第?5票?
  • singsong1正售出第?4票?
  • singsong1正售出第?3票?
  • singsong1正售出第?2票?
  • singsong1正售出第?1票?
  • 從運行結果可以得出實現Runnable接口的優點。

    大家有沒有想過Runnable接口為什么能實現資源的共享,而Thread類不能

    ?本人個人理解

    首先看如下代碼:?

  • public?class?TestThread1?{?
  • ????public?static?void?main(String[]?args)?{?
  • ????????RunnableThread?runnableThread1?=?new?RunnableThread("singsong1");?
  • ????????RunnableThread?runnableThread2?=?new?RunnableThread("singsong2");?
  • ????????Thread?thread1?=?new?Thread(runnableThread1);?
  • ????????Thread?thread2?=?new?Thread(runnableThread2);?
  • ????????thread1.start();?
  • ????????thread2.start();?
  • ????}?
  • }?
  • 此代碼是在TestThread1類的繼承上修改的:添加了??? RunnableThread runnableThread2 = new RunnableThread("singsong2");

    runnableThread1換成runnableThread2

    現在我們在運行程序看看結果:

  • singsong1正售出第?5票?
  • singsong1正售出第?4票?
  • singsong1正售出第?3票?
  • singsong1正售出第?2票?
  • singsong1正售出第?1票?
  • singsong2正售出第?5票?
  • singsong2正售出第?4票?
  • singsong2正售出第?3票?
  • singsong2正售出第?2票?
  • singsong2正售出第?1票?
  • ?

    從結果可以知道也重復了一次。

    ?

    總結一下:也是就說Runnable接口能實現資源的共享是因為用同一個實現Runnable接口的子類來創建不同的線程,去執行同一個任務。而Thread卻沒有這種機制。

    ?

    ?

    轉載于:https://blog.51cto.com/singsong/1163248

    總結

    以上是生活随笔為你收集整理的java线程之基础学习的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。