多執行緒方式實作(1)
方式1:繼承Thread類,
* 步驟
* A:自定義類MyThread繼承Thread類,
* B:MyThread類里面重寫run()?
* 為什么是run()方法呢?
* C:創建物件
* D:啟動執行緒
*/
package cn.itcast_02; /* * 該類要重寫run()方法,為什么呢? * 不是類中的所有代碼都需要被執行緒執行的, * 而這個時候,為了區分哪些代碼能夠被執行緒執行,java提供了Thread類中的run()用來包含那些被執行緒執行的代碼, */ public class MyThread extends Thread { @Override public void run() { // 自己寫代碼 // System.out.println("好好學習,天天向上"); // 一般來說,被執行緒執行的代碼肯定是比較耗時的,所以我們用回圈改進 for (int x = 0; x < 200; x++) { System.out.println(x); } } }
package cn.itcast_02; /* * 需求:我們要實作多執行緒的程式, * 如何實作呢? * 由于執行緒是依賴行程而存在的,所以我們應該先創建一個行程出來, * 而行程是由系統創建的,所以我們應該去呼叫系統功能創建一個行程, * Java是不能直接呼叫系統功能的,所以,我們沒有辦法直接實作多執行緒程式, * 但是呢?Java可以去呼叫C/C++寫好的程式來實作多執行緒程式, * 由C/C++去呼叫系統功能創建行程,然后由Java去呼叫這樣的東西, * 然后提供一些類供我們使用,我們就可以實作多執行緒程式了, * 那么Java提供的類是什么呢? * Thread * 通過查看API,我們知道了有2中方式實作多執行緒程式, * * 方式1:繼承Thread類, * 步驟 * A:自定義類MyThread繼承Thread類, * B:MyThread類里面重寫run()? * 為什么是run()方法呢? * C:創建物件 * D:啟動執行緒 */ public class MyThreadDemo { public static void main(String[] args) { // 創建執行緒物件 // MyThread my = new MyThread(); // // 啟動執行緒 // my.run(); // my.run(); // 呼叫run()方法為什么是單執行緒的呢? // 因為run()方法直接呼叫其實就相當于普通的方法呼叫,所以你看到的是單執行緒的效果 // 要想看到多執行緒的效果,就必須說說另一個方法:start() // 面試題:run()和start()的區別? // run():僅僅是封裝被執行緒執行的代碼,直接呼叫是普通方法 // start():首先啟動了執行緒,然后再由jvm去呼叫該執行緒的run()方法, // MyThread my = new MyThread(); // my.start(); // // IllegalThreadStateException:非法的執行緒狀態例外 // // 為什么呢?因為這個相當于是my執行緒被呼叫了兩次,而不是兩個執行緒啟動, // my.start(); // 創建兩個執行緒物件 MyThread my1 = new MyThread(); MyThread my2 = new MyThread(); my1.start(); my2.start(); } }
獲取和設定執行緒物件名稱
//我要獲取main方法所在的執行緒物件的名稱,該怎么辦呢?
//遇到這種情況,Thread類提供了一個很好玩的方法:
//public static Thread currentThread():回傳當前正在執行的執行緒物件
System.out.println(Thread.currentThread().getName());
package cn.itcast_03; public class MyThread extends Thread { public MyThread() { } public MyThread(String name){ super(name); } @Override public void run() { for (int x = 0; x < 100; x++) { System.out.println(getName() + ":" + x); } } }
package cn.itcast_03; /* * 如何獲取執行緒物件的名稱呢? * public final String getName():獲取執行緒的名稱, * 如何設定執行緒物件的名稱呢? * public final void setName(String name):設定執行緒的名稱 * * 針對不是Thread類的子類中如何獲取執行緒物件名稱呢? * public static Thread currentThread():回傳當前正在執行的執行緒物件 * Thread.currentThread().getName() */ public class MyThreadDemo { public static void main(String[] args) { // 創建執行緒物件 //無參構造+setXxx() // MyThread my1 = new MyThread(); // MyThread my2 = new MyThread(); // //呼叫方法設定名稱 // my1.setName("林青霞"); // my2.setName("劉意"); // my1.start(); // my2.start(); //帶參構造方法給執行緒起名字 // MyThread my1 = new MyThread("林青霞"); // MyThread my2 = new MyThread("劉意"); // my1.start(); // my2.start(); //我要獲取main方法所在的執行緒物件的名稱,該怎么辦呢? //遇到這種情況,Thread類提供了一個很好玩的方法: //public static Thread currentThread():回傳當前正在執行的執行緒物件 System.out.println(Thread.currentThread().getName()); } } /* 名稱為什么是:Thread-? 編號 class Thread { private char name[]; public Thread() { init(null, null, "Thread-" + nextThreadNum(), 0); } private void init(ThreadGroup g, Runnable target, String name, long stackSize) { init(g, target, name, stackSize, null); } private void init(ThreadGroup g, Runnable target, String name, long stackSize, AccessControlContext acc) { //大部分代碼被省略了 this.name = name.toCharArray(); } public final void setName(String name) { this.name = name.toCharArray(); } private static int threadInitNumber; //0,1,2 private static synchronized int nextThreadNum() { return threadInitNumber++; //return 0,1 } public final String getName() { return String.valueOf(name); } } class MyThread extends Thread { public MyThread() { super(); } } */
執行緒調度及獲取和設定執行緒優先級
package cn.itcast_04; public class ThreadPriority extends Thread { @Override public void run() { for (int x = 0; x < 100; x++) { System.out.println(getName() + ":" + x); } } }
package cn.itcast_04; /* * 我們的執行緒沒有設定優先級,肯定有默認優先級, * 那么,默認優先級是多少呢? * 如何獲取執行緒物件的優先級? * public final int getPriority():回傳執行緒物件的優先級 * 如何設定執行緒物件的優先級呢? * public final void setPriority(int newPriority):更改執行緒的優先級, * * 注意: * 執行緒默認優先級是5, * 執行緒優先級的范圍是:1-10, * 執行緒優先級高僅僅表示執行緒獲取的 CPU時間片的幾率高,但是要在次數比較多,或者多次運行的時候才能看到比較好的效果, * * IllegalArgumentException:非法引數例外, * 拋出的例外表明向方法傳遞了一個不合法或不正確的引數, * */ public class ThreadPriorityDemo { public static void main(String[] args) { ThreadPriority tp1 = new ThreadPriority(); ThreadPriority tp2 = new ThreadPriority(); ThreadPriority tp3 = new ThreadPriority(); tp1.setName("東方不敗"); tp2.setName("岳不群"); tp3.setName("林平之"); // 獲取默認優先級 // System.out.println(tp1.getPriority()); // System.out.println(tp2.getPriority()); // System.out.println(tp3.getPriority()); // 設定執行緒優先級 // tp1.setPriority(100000); //設定正確的執行緒優先級 tp1.setPriority(10); tp2.setPriority(1); tp1.start(); tp2.start(); tp3.start(); } }
練習版
package Day23; /* * * 方式1:繼承Thread類, * 步驟 * A:自定義類MyThread繼承Thread類, * B:MyThread類里面重寫run()? * 為什么是run()方法呢? * C:創建物件 * D:啟動執行緒 */ public class ThreadDemo { public static void main(String[] args) { //創建物件 MyThreadDemo myd = new MyThreadDemo(); MyThreadDemo myd1 = new MyThreadDemo(); MyThreadDemo myd2 = new MyThreadDemo(); //啟動執行緒 //public void start()使該執行緒開始執行;Java 虛擬機呼叫該執行緒的 run 方法 //結果是兩個執行緒并發地運行;當前執行緒(從呼叫回傳給 start 方法)和另一個執行緒(執行其 run 方法), //設定該執行緒物件的名稱 myd.setName("劉備"); myd1.setName("關羽"); myd2.setName("張飛"); //設定執行緒執行優先級 //public final void setPriority(int newPriority)更改執行緒的優先級, //引數:newPriority - 要為執行緒設定的優先級 myd.setPriority(1); myd1.setPriority(10); myd2.setPriority(5); // //創建物件的同時設定執行緒名稱---- // MyThreadDemo myd2 = new MyThreadDemo("長江"); // MyThreadDemo myd3 = new MyThreadDemo("黃河"); //運行呼叫-----輸出查看 myd.start(); myd1.start(); myd2.start(); } }
執行緒控制之執行緒休眠
package cn.itcast_04; import java.util.Date; public class ThreadSleep extends Thread { @Override public void run() { for (int x = 0; x < 100; x++) { System.out.println(getName() + ":" + x + ",日期:" + new Date()); // 睡眠 // 困了,我稍微休息1秒鐘 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
package cn.itcast_04; /* * 執行緒休眠 * public static void sleep(long millis) */ public class ThreadSleepDemo { public static void main(String[] args) { ThreadSleep ts1 = new ThreadSleep(); ThreadSleep ts2 = new ThreadSleep(); ThreadSleep ts3 = new ThreadSleep(); ts1.setName("林青霞"); ts2.setName("林志玲"); ts3.setName("林志穎"); ts1.start(); ts2.start(); ts3.start(); } }
執行緒控制之執行緒之加入執行緒
package Day23; //創建新執行執行緒有兩種方法,一種方法是將類宣告為 Thread 的子類, // 該子類應重寫 Thread 類的 run 方法, public class ThreadDemo1 extends Thread { //重寫Thread中的run方法 @Override public void run() { for(int x=0;x<100;x++){ //獲取執行緒物件的名稱 System.out.println(getName()+":"+x); } } }
package Day23; import com.sun.org.apache.bcel.internal.generic.NEW; //執行緒控制之加入執行緒 //public final void join() // throws InterruptedException等待該執行緒終止,----該執行緒終止后再運行其他的 public class join { public static void main(String[] args) throws InterruptedException { //創建ThreadDemo1物件 ThreadDemo1 TD = new ThreadDemo1(); ThreadDemo1 TD1 = new ThreadDemo1(); ThreadDemo1 TD2 = new ThreadDemo1(); //設定執行緒物件名稱 //public final void setName(String name)改變執行緒名稱,使之與引數 name 相同, TD.setName("劉備"); TD1.setName("關羽"); TD2.setName("張飛"); //執行執行緒 TD.start(); //首先執行此執行緒---此執行緒執行完畢后再執行其他執行緒 //public final void join() //throws InterruptedException等待該執行緒終止 TD.join(); TD1.start(); TD2.start(); } }
執行緒控制之執行緒禮讓
public static void yield()
- 暫停當前正在執行的執行緒物件,并執行其他執行緒,
package cn.itcast_04; public class ThreadYield extends Thread { @Override public void run() { for (int x = 0; x < 100; x++) { System.out.println(getName() + ":" + x); Thread.yield(); } } }
package cn.itcast_04; /* * public static void yield():暫停當前正在執行的執行緒物件,并執行其他執行緒, * 讓多個執行緒的執行更和諧,但是不能靠它保證一人一次, */ public class ThreadYieldDemo { public static void main(String[] args) { ThreadYield ty1 = new ThreadYield(); ThreadYield ty2 = new ThreadYield(); ty1.setName("林青霞"); ty2.setName("劉意"); ty1.start(); ty2.start(); } }
執行緒控制之守護執行緒
package cn.itcast_04; public class ThreadDaemon extends Thread { @Override public void run() { for (int x = 0; x < 100; x++) { System.out.println(getName() + ":" + x); } } }
package cn.itcast_04; /* * public final void setDaemon(boolean on):將該執行緒標記為守護執行緒或用戶執行緒, * 當正在運行的執行緒都是守護執行緒時,Java 虛擬機退出, 該方法必須在啟動執行緒前呼叫, * * 游戲:坦克大戰, */ public class ThreadDaemonDemo { public static void main(String[] args) { ThreadDaemon td1 = new ThreadDaemon(); ThreadDaemon td2 = new ThreadDaemon(); td1.setName("關羽"); td2.setName("張飛"); // 設定守護執行緒 td1.setDaemon(true); td2.setDaemon(true); td1.start(); td2.start(); //主執行緒---主執行緒結束--守護執行緒也會隨之停止 Thread.currentThread().setName("劉備"); for (int x = 0; x < 5; x++) { System.out.println(Thread.currentThread().getName() + ":" + x); } } }
執行緒控制之中斷執行緒
public void interrupt():中斷執行緒, 把執行緒的狀態終止,并拋出一個InterruptedException
package cn.itcast_04; import java.util.Date; public class ThreadStop extends Thread { @Override public void run() { System.out.println("開始執行:" + new Date()); // 我要休息10秒鐘,親,不要打擾我哦 try { Thread.sleep(10000); } catch (InterruptedException e) { // e.printStackTrace(); System.out.println("執行緒被終止了"); } System.out.println("結束執行:" + new Date()); } }
package cn.itcast_04; /* * public final void stop():讓執行緒停止,過時了,但是還可以使用, * public void interrupt():中斷執行緒, 把執行緒的狀態終止,并拋出一個InterruptedException, */ public class ThreadStopDemo { public static void main(String[] args) { ThreadStop ts = new ThreadStop(); ts.start(); // 你超過三秒不醒過來,我就干死你 try { Thread.sleep(3000); // ts.stop(); ts.interrupt(); } catch (InterruptedException e) { e.printStackTrace(); } } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/455579.html
標籤:其他
