簡介
使用
使用步驟
常規方式
// 步驟1:創建線程輔助類,實現Runnable接口
class MyThread implements Runnable{
....
@Override
// 步驟2:複寫run(),定義線程行爲
public void run(){
}
}
// 步驟3:創建線程輔助對象,即 實例化 線程輔助類
MyThread mt=new MyThread();
// 步驟4:創建線程對象,即 實例化線程類;線程類 = Thread類;
// 創建時通過Thread類的構造函數傳入線程輔助類對象
// 原因:Runnable接口並沒有任何對線程的支持,我們必須創建線程類(Thread類)的實例,從Thread類的一個實例內部運行
Thread td=new Thread(mt);
// 步驟5:通過 線程對象 控制線程的狀態,如 運行、睡眠、掛起 / 停止
// 當調用start()方法時,線程對象會自動回調線程輔助類對象的run(),從而實現線程操作
td.start();
實例
說明:實現 2 個窗口同時賣火車票;每個窗口賣 100 張,賣票速度都是 1 s/張
main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.carson_ho.demoforrunnable.MainActivity">
//設置一個按鈕用以啓動線程
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="點擊開始賣票" />
</RelativeLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
//主佈局中定義了一個按鈕用以啓動線程
Button button;
//步驟1:創建線程類,實現Runnable接口
private class MyThread1 implements Runnable{
private int ticket = 100;//一個窗口有100張票
//在run方法裏複寫需要進行的操作:賣票速度1s/張
@Override
public void run(){
while (ticket>0){
ticket--;
System.out.println(Thread.currentThread().getName() + "賣掉了1張票,剩餘票數爲:"+ticket);
try {
Thread.sleep(1000);//賣票速度是1s一張
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Button按下時會開啓一個新線程執行賣票
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//步驟2:創建線程類的實例
//創建二個線程,模擬二個窗口賣票
MyThread1 mt1 = new MyThread1();
MyThread1 mt2 = new MyThread1();
Thread mt11 = new Thread(mt1, "窗口1");
Thread mt22 = new Thread(mt2, "窗口2");
//步驟3:調用start()方法開啓線程
//啓動二個線程,也即是窗口,開始賣票
mt11.start();
mt22.start();
}
});
}
}
測試結果:
匿名類
// 步驟1:通過匿名類 直接 創建線程輔助對象,即 實例化 線程輔助類
Runnable mt = new Runnable() {
// 步驟2:複寫run(),定義線程行爲
@Override
public void run() {
}
};
// 步驟3:創建線程對象,即 實例化線程類;線程類 = Thread類;
Thread mt1 = new Thread(mt, "窗口1");
// 步驟4:通過 線程對象 控制線程的狀態,如 運行、睡眠、掛起 / 停止
mt1.start();
實例
說明:實現 2 個窗口同時賣火車票;每個窗口賣 100 張,但賣票速度不同:窗口 1 是 1 s/張,窗口 2 是 3 s/張
main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.carson_ho.demoforrunnable2.MainActivity">
//設置按鈕用以啓動線程
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="點擊開始賣票" />
</RelativeLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
//主佈局中定義了一個按鈕用以啓動線程
Button button;
//步驟1:創建線程類,實現Runnable接口
//由於需要實現兩個不同的操作:賣票速度1s/張和3s/張
//所以需要創建兩個線程類並實現Runnable接口
//第一個線程類:實現賣票速度1s/張操作
private class MyThread1 implements Runnable{
private int ticket = 100;//一個窗口有100張票
//在run方法裏複寫需要進行的操作:賣票速度1s/張
@Override
public void run(){
while (ticket>0){
ticket--;
System.out.println(Thread.currentThread().getName() + "賣掉了1張票,剩餘票數爲:"+ticket);
try {
Thread.sleep(1000);//賣票速度是1s一張
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//第二個線程類:實現賣票速度3s/張操作
private class MyThread2 implements Runnable{
private int ticket = 100;//一個窗口有100張票
//在run方法裏複寫需要進行的操作:賣票速度3s/張
@Override
public void run(){
while (ticket>0){
ticket--;
System.out.println(Thread.currentThread().getName() + "賣掉了1張票,剩餘票數爲:"+ticket);
try {
Thread.sleep(3000);//賣票速度是3s一張
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Button按下時會開啓一個新線程執行賣票
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//步驟2:創建線程類的實例
//分別實例化兩個線程子類
MyThread1 mt1 = new MyThread1();
MyThread2 mt2 = new MyThread2();
//創建二個線程,模擬二個窗口賣票
Thread mt11 = new Thread(mt1, "窗口1");//賣票速度1s/張
Thread mt22 = new Thread(mt2, "窗口2");//賣票速度3s/張
//步驟3:調用start()方法開啓線程
//啓動二個線程,也即是窗口,開始賣票
mt11.start();
mt22.start();
}
});
}
}
測試結果: