線程:就是進程中的一個獨立的控制單元。線程在控制著進程的執行。
線程的建立
一:繼承Thread類。步驟:
1,定義類繼承Thread。
2,複寫Thread類中的run方法。 目的:將自訂代碼儲存在run方法。讓線程運行。
class Demo extends Thread
{
public void run()
{
for(int x=0; x<60; x++)
System.out.println("demo run"+x);
}
}
線程的運行狀態:
二:建立線程的第二種方式:實現Runable介面
步驟:
1,定義類實現Runnable介面
2,覆蓋Runnable介面中的run方法。 將線程要啟動並執行代碼存放在該run方法中。
3,通過Thread類建立線程對象。
4,將Runnable介面的子類對象作為實際參數傳遞給Thread類的建構函式。
5,調用Thread類的start方法開啟線程並調用Runnable介面子類的run方法。
class Ticket implements Runnable//extends Thread {
private int tick = 100;
public void run() {
while(true) {
if(tick>0)
System.out.println(Thread.currentThread().getName()+"....sale : "+ tick");
Test t2 = new Test("two+++");
t1.start();
t2.start();
}
}
多線程的安全問題:通過分析,發現,列印出0,-1,-2等錯票。問題的原因:當多條語句在操作同一個線程共用資料時,一個線程對多條語句只執行了一部分,還沒有執
行完,另一個線程參與進來執行。導致共用資料的錯誤。解決辦法:對多條操作共用資料的語句,只能讓一個線程都執行完。在執行過程中,其他線程不可以參與執行。這就出來了
同步代碼塊
synchronized(對象) {
需要被同步的代碼
}
對象如同鎖。持有鎖的線程可以在同步中執行。 沒有持有鎖的線程即使擷取cpu的執行權,也進不去,因為沒有擷取鎖。
同步的前提:1,必須要有兩個或者兩個以上的線程;2,必須是多個線程使用同一個鎖。
好處:解決了多線程的安全問題。
弊端:多個線程需要判斷鎖,較為消耗資源。
class Ticket implements Runnable {
private int tick = 1000;
Object obj = new Object();
public void run() {
while(true) {
synchronized(obj) {
if(tick>0) {
//try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"....sale : "+ tick);
}
}
}
}
else
while(true)
show();
}
public synchronized void show()//this
{
if(tick>0) {
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick);
}
}
}
}
else
while(true)
show();
}
public static synchronized void show() {
if(tick>0) {
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick>A;
s = new Single();
}
}
return s;
}
}
class SingleDemo {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
死結:
class Test implements Runnable {
private boolean flag;
Test(boolean flag) {
this.flag = flag;
}
public void run() {
if(flag) {
while(true) {
synchronized(MyLock.locka) {
System.out.println(Thread.currentThread().getName()+"...if locka ");
synchronized(MyLock.lockb) {
System.out.println(Thread.currentThread().getName()+"..if lockb");
}
}
}
}
else {
while(true) {
synchronized(MyLock.lockb) {
System.out.println(Thread.currentThread().getName()+"..else lockb");
synchronized(MyLock.locka) {
System.out.println(Thread.currentThread().getName()+".....else locka");
}
}
}
}
}
}
class MyLock {
static Object locka = new Object();
static Object lockb = new Object();
}
class DeadLockTest {
public static void main(String[] args) {
Thread t1 = new Thread(new Test(true));
Thread t2 = new Thread(new Test(false));
t1.start();
t2.start();
}
}