目錄
1. 通過繼承Thread類的方法創建兩個線程,在Thread構造方法中指定線程的名稱,並將這兩個線程的名字打印出來。
2. 通過實現Runnable接口的方法創建一個新線程,要求main線程打印100次“main”,新線程打印50次“new”。
3. 模擬三個老師同時發80份學習筆記本,每次只發放一份筆記本,每個老師相當於一個線程。
一、實驗目的
1. 掌握Java多線程的創建及其啓動,多線程的兩種常用創建方式及其區別;
2. 掌握多線程的生命週期及五種基本狀態,分別是新建狀態(New)、就緒狀態(Runnable)、運行狀態(Running)、阻塞狀態(Blocked)、死亡狀態(Dead);
3. 掌握引起Java線程阻塞的主要方法,如:jion()方法、sleep()方法、yeild()方法;
4. 掌握線程安全及其解決機制,如:同步方法、同步代碼塊等。
二、實驗代碼
1. 通過繼承Thread類的方法創建兩個線程,在Thread構造方法中指定線程的名稱,並將這兩個線程的名字打印出來。
package 作業練習.test6;
public class Study_1 extends Thread {
public Study_1(String name) {
super(name);
}
public void run() {
System.out.println(this.getName());
}
public static void main(String[] args) {
new Study_1("Thread1").start();
new Study_1("Thread2").start();
}
}
2. 通過實現Runnable接口的方法創建一個新線程,要求main線程打印100次“main”,新線程打印50次“new”。
package 作業練習.test6;
public class Study_2 implements Runnable {
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println("new");
}
}
public static void main(String[] args) {
new Thread(new Study_2()).start();
for (int i = 0; i < 100; i++) {
System.out.println("main");
}
}
}
3. 模擬三個老師同時發80份學習筆記本,每次只發放一份筆記本,每個老師相當於一個線程。
package 作業練習.test6;
public class Study_3 implements Runnable {
private int number = 80; //總共80份學習筆記
private int count = 0; //發第幾份
@Override
public void run() {
while (true) {
synchronized (this) {
if (number <= 0) {
break;
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
number--;
count++;
System.out.println(Thread.currentThread().getName() + "正在發第" + count + "份學習筆記,還有" + number + "份學習筆記。");
}
}
}
public static void main(String[] args) {
Study_3 homeWork3 = new Study_3();
new Thread(homeWork3, "老師甲").start();
new Thread(homeWork3, "老師乙").start();
new Thread(homeWork3, "老師丙").start();
}
}
4. 編寫如圖6-1所示的界面,當程序運行時:
(1)每隔兩秒鐘在顯示字母區域隨機顯示一個字母(如圖所示,顯示的字母是“g”);
(2)用戶在文本框中使用輸入相應的字母,如果輸入正確則得1分,否則得0分;
(3)並將用戶的得分累計顯示在的得分欄。
package 作業練習.test6;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.input.KeyCode;
import javafx.stage.Stage;
import java.awt.*;
import java.awt.event.KeyEvent;
public class Text4 extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
Label l1 = new Label("顯示字母:");
TextField l2 = new TextField("A");
l2.setEditable(false);
l2.setPrefWidth(30.0);//文本框大小
Label l3 = new Label("輸入所顯示的字母(回車)");
TextField l4 = new TextField();
Label l5 = new Label("得分");
Label l6 = new Label("0");
new Thread(new Runnable() {
@Override
public void run() {
while(true){
char str;
str = (char)(Math.random()*26+'a');
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String s = String.valueOf(str);
l2.setText(s);
}
}
}).start();
l4.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent e) {
if (e.getCode()== KeyCode.ENTER){
String text1 = l2.getText();
String text2 = l4.getText();
String text3 = l6.getText();
int i = Integer.parseInt(text3);
if (text1.equals(text2)){
i+=1;
l6.setText(String.valueOf(i));
}
}
l4.clear();
}
});
FlowPane flowPane = new FlowPane(); //添加面板
flowPane.getChildren().addAll(l1,l2,l3,l4,l5,l6); //吧空控件添加到面板上
Scene scene = new Scene(flowPane); //創建場景
stage.setScene(scene); //吧場景添加到舞臺
stage.setWidth(900);
stage.show();
}
}
每文一語
有些東西,只有有了遺憾纔會懂得珍惜!