多線程的實現方式 一
package Test_12;
/*
* 進程:當前正在運行的程序,一個應用程序在內存中的執行區域
* 線程:進程中的一個執行控制單元
*
* 一個進程可以有一個線程(單線程),也可以有多個線程(多線程)
*
* 單線程:安全性高,效率低
* 多線程:效率高,安全性低
*
* 多線程的實現:
* 1.一種方法是將類聲明爲 Thread 的子類。該子類應重寫 Thread 類的 run 方法。
* 2.另一種方法是聲明實現 Runnable 接口的類。該類然後實現 run 方法。
* 然後可以分配該類的實例,在創建 Thread 時作爲一個參數來傳遞並啓動。
*
* Thread類的方法:
* 1. String getName() 返回該線程的名稱。
* 2. void setName(String name) 改變線程名稱,使之與參數 name 相同。
* 3. void start() 使該線程開始執行;Java 虛擬機調用該線程的 run 方法。
*
*/
public class ThreadDemo {
public static void main(String[] args) {
//創建線程對象
MyThread mt = new MyThread();
//修改線程名
mt.setName("線程一");
//啓動線程
mt.start();
//創建線程對象
MyThread mt2 = new MyThread();
//修改線程名
mt2.setName("線程二");
//啓動線程
mt2.start();
}
}
----------
package Test_12;
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName()+":"+i);
}
}
}
多線程的實現方式二
package Test_12;
/*
* 多線程的實現方式二:
* 聲明實現 Runnable 接口的類。該類然後實現 run 方法。
* 然後可以分配該類的實例,在創建 Thread 時作爲一個參數來傳遞並啓動。
*
* Thread(Runnable target) 分配新的 Thread 對象。
*
* static Thread currentThread() 返回對當前正在執行的線程對象的引用。
*
*
*
*/
public class ThreadDemo2 {
public static void main(String[] args) {
//創建線程對象
MyThread mt = new MyThread();
//修改線程名
mt.setName("線程一");
//啓動線程
mt.start();
//創建線程對象
MyThread mt2 = new MyThread();
//修改線程名
mt2.setName("線程二");
//啓動線程
mt2.start();
}
}
----------
package Test_12;
public class MyThread2 implements Runnable {
@Override
public void run() {
Thread tr = Thread.currentThread();
for (int i = 0; i < 100; i++) {
System.out.println(tr.getName()+":"+i);
}
}
/*@Override
public void run() {
// Thread tr = Thread.currentThread();
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}*/
/*@Override
public void run() {
// Thread tr = new Thread();
for (int i = 0; i < 100; i++) {
System.out.println(new Thread().getName()+":"+i);
}
}*/
}
多線程模擬火車站售票
package Test_12;
/*
* 多線程模擬火車站售票
* 分析:
* 1.定義火車票總量,每出售一張則總票數減一
* 2.當總票數等於零時則停止售票
* 3.使用多線程模擬多個售票窗口售票
*
* static void sleep(long millis) 在指定的毫秒數內讓當前正在執行的線程休眠(暫停執行),此操作受到系統計時器和調度程序精度和準確性的影響。
*
* synchronized:同步(鎖),可以修飾代碼塊和方法,被修飾的代碼塊和方法一旦被某個線程訪問,則直接被鎖住,其他的線程無法訪問
*
* 同步代碼塊:
* synchronized(鎖對象){
*
* }
* 注意:鎖對象需要被所有的線程所共享
*
* 同步方法:使用關鍵字synchronized修飾的方法,一旦被一個線程訪問,則整個方法全部被鎖住,其他線程無法訪問
*
* 注意:
* 1.非靜態同步方法的鎖對象是this
* 2.靜態同步方法的鎖對象是當前類的字節碼對象
*
*/
public class TicketTest {
public static void main(String[] args) {
//創建線程對象
TicketThread tt = new TicketThread();
Thread tr = new Thread(tt);
//修改線程名
tr.setName("窗口1");
//啓動線程
tr.start();
Thread tr2 = new Thread(tt);
//修改線程名
tr2.setName("窗口2");
//啓動線程
tr2.start();
Thread tr3 = new Thread(tt);
//修改線程名
tr3.setName("窗口3");
//啓動線程
tr3.start();
}
}
----------
package Test_12;
public class TicketThread implements Runnable {
int tickets = 100; //火車票總量
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
method();
}
}
private synchronized void method() {
if(tickets>0){
try {
Thread.sleep(100);//線程休眠100ms
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":"+tickets--);
}
}
}