Java多執行緒的應用
多執行緒的調動是
隨著cpu排程的,可以給執行緒設定優先順序,但最終還是要依靠CPU的排程,無法確定執行緒的執行順序。
多執行緒的實現方法
繼承Thread類,重寫run()方法,呼叫start開始執行緒;
實現Runnable介面,重寫run()方法,執行執行緒需要丟入Runnable實現介面類,呼叫start方法;
實現Callable介面,並用其初始化Thread,然後建立Thread例項,並呼叫start方法。
詳細說明
繼承Thread類
//建立執行緒方式一:繼承Thread類,重寫run()方法,呼叫start開始執行緒
public class demo1 extends Thread {
@Override
public void run() { //重寫run方法
for (int i = 0; i <= 99; i++) {
System。out。println(i+“在學習多執行緒”); }}
public static void main(String[] args) {
demo1 thread = new demo1();
thread。start(); //啟動run方法
for (int i = 0; i <= 99; i++) {
System。out。println(“主方法”+i+“也在學習多執行緒”); }}}
Thread本質上也是實現了Runnable介面的一個例項,它代表一個執行緒的例項,啟動執行緒的唯一方法就是透過Thread類的start()例項方法。執行結果是
隨著cpu排程的,可以給執行緒設定優先順序,但最終還是要依靠CPU的排程,無法確定執行緒的執行順序。
2.
實現Runnable介面
public class demo4 implements Runnable {
private int ticketNum = 10;
@Override
public void run() { //重寫run方法
while (true){
if (ticketNum<=0){
break;}
System。out。println(Thread。currentThread()。getName() + “拿走了第”+ ticketNum + “票。”);
ticketNum——; }}
public static void main(String[] args) {
demo4 t1 = new demo4();
demo4 t2 = new demo4();
demo4 t3 = new demo4();
new Thread(t1,“Jeri”)。start(); //執行執行緒
new Thread(t2,“Jordon”)。start();
new Thread(t3,“Knight”)。start(); }}
當自己的類已經繼承(extends)了另一個類,就無法再次extends Thread。此時,必須實現一個Runnable介面,如上所示。但實現Runnable介面的執行緒執行與extends Thread有所不同,需要new一個Thread物件,再把執行緒丟入,最後start。
舉一個龜兔賽跑的例子,烏龜不停跑,兔子偶爾會休息:
//龜兔賽跑模擬
public class demo5_race implements Runnable {
private static String winner;
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
//如果是兔子,就讓他休息1ms,下面的條件表示的是i是10的倍數時兔子再休息
if (Thread。currentThread()。getName()。equals(“兔子”) && i % 10 ==0){
try {
Thread。sleep(1);
} catch (InterruptedException e) {
e。printStackTrace();} }
//判斷是否有勝利者出現了
boolean flag = gameOver(i);
if (flag){
break; }
System。out。println(Thread。currentThread()。getName() + “跑了” + i + “步”); }}
//判斷比賽是否結束了
public boolean gameOver(int step){
if (winner != null){
return true;
}{
if (step >= 100){
winner = Thread。currentThread()。getName();
System。out。println(winner + “ is winner!”);
return true; }}
return false; }
//主函,兩個執行緒
public static void main(String[] args) {
demo5_race race = new demo5_race();
new Thread(race,“烏龜”)。start();
new Thread(race,“兔子”)。start(); }}
當使用Thread。sleep()方法時,就模擬了兔子的休息。此時烏龜仍然在跑。執行結果自然就大機率是烏龜是贏家。
3。 實現Callable介面
package thread;
import java。util。concurrent。*;
public class demo6_callable implements Callable
@Override
public Boolean call() throws Exception {
for (int i = 0; i < 10; i++) {
System。out。println(Thread。currentThread()。getName()+“call方法的執行緒正在跑。。。”); }
return true;}
public static void main(String[] args) throws ExecutionException, InterruptedException {
for (int i = 0; i < 10; i++) {
System。out。println(Thread。currentThread()。getName()+“主方法的執行緒。。。”); }
demo6_callable demo6 = new demo6_callable();
//建立執行服務
ExecutorService ser = Executors。newFixedThreadPool(3);
//提交執行
Future
//獲取結果
Boolean aBoolean = sub。get();
//關閉服務
ser。shutdown();}}