Java多线程创建实例
1. 单个线程的创建
创建方式很多,这里使用推荐的创建方法
第一步: 创建接口(Runnable)实现类, 并重写run方法
public class Demo implements Runnable {
// 重写 run 方法
@Override
public void run() {
System.out.println("这个函数主体用于执行由此类所创建的对象线程的分支线程的控制执行");
}
}
第二步 : 创建实例对象, 并用Thread类开启一个线程
public class Main {
public static void main(String[] args) {
System.out.println("我们稍后将会创建一个线程");
// 创建实例对象
Demo demo = new Demo();
// 创建一个线程,将demo加载到该线程当中,并且命名该线程名为"One"
Thread thread = new Thread(demo,"One");
// 开启线程
thread.start();
System.out.println("那个线程已经开始执行了,我们先不必管它了!!!");
}
}
2. 多个线程同时操作同一个对象
第一步: 创建接口类
public class Demo implements Runnable{
// 票数100,程序执行过程中票数会不断减少
private int ticketNums = 100;
@Override
public void run() {
while (true) {
if (Thread.currentThread().getName() == "小明" && ticketNums%10 == 0 ) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (ticketNums <= 0) {
break;
}
System.out.println(Thread.currentThread().getName() + "-->拿到了第" + ticketNums-- + "票");
}
}
第二步: 创建多线程
public static void main(String[] args) {
// 创建一个线程对象
TestThread4 t1 = new TestThread4();
// 开启个实例对象的线程,让多个线程同时去执行操作同一个对象
new Thread(t1,"小明").start();
new Thread(t1,"小刘").start();
new Thread(t1,"黄牛").start();
// 执行的原理: 由于操作的对象是同一个,所以谁先抢到就是谁的资源
}
执行结果:
黄牛-->拿到了第100票
黄牛-->拿到了第98票
黄牛-->拿到了第97票
黄牛-->拿到了第96票
黄牛-->拿到了第95票
黄牛-->拿到了第94票
......
黄牛-->拿到了第4票
黄牛-->拿到了第3票
黄牛-->拿到了第2票
黄牛-->拿到了第1票
小明-->拿到了第6票
小刘-->拿到了第8票
3. 多个线程同时操作多个由相同类实例化的对象(龟兔赛跑)
第一步 : 创建接口类
/** 龟兔赛跑游戏
* <p>  通过开启两个线程, 使用不同的两个对象(由同一个类创建得到), 来同时执行观察执行的情况。 同时设置一个开始信号和一个结束信号, 代表所有对象开始出发以及停止赛跑</p>
*/
public class Race implements Runnable{
/** 创建一个静态全局变量winner, 一旦产生冠军, 整个对象会通过改变冠军当前状态来终止所有线程 */
public static boolean winner = false;
/** 创建一个全局静态变量timer,倒计时出发时间,默认是10,本变量的操作权限仅由裁判操作*/
public static int timer;
/** 设置比赛的距离distance, 根据比赛距离动态调整比赛现状 */
private int distance;
public Race( int distance) {
this.distance = distance;
}
@Override
public void run() {
while (timer != -1){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (Thread.currentThread().getName() == "referee") {
System.out.println("倒计时:" + timer + "秒");
timer--;
if (timer == -1) {
System.out.println("砰!!!比赛开始!");
return;
}
}
}
for (int i = 0; i <= distance; i++) {
if (Thread.currentThread().getName() == "兔子") {
try {
Thread.sleep(1);
if ( i == distance*8/10 )
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (Thread.currentThread().getName() == "乌龟") {
try {
Thread.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if ( winner == true)
return;
System.out.println("现在" + Thread.currentThread().getName() + "已经距离终点只剩" + (distance - i) +"米");
}
winner = true;
System.out.println("恭喜" + Thread.currentThread().getName() + "获得冠军!!!");
}
public Race setTimer(int timer) {
Race.timer = timer;
return this;
}
第二步 : 创建运行多线程
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("请输入这场比赛的距离: ");
int distance = in.nextInt();
// 分别创建兔子和乌龟两个对象 并且增加一个裁判
Race referee = new Race(distance);
// 由裁判通过操作静态变量设置倒计时为3
referee.setTimer(3);
Race rabbit = new Race(distance);
Race tortoise = new Race(distance);
// 分别为兔子和乌龟创建两个线程 另外为裁判也增加一个线程
new Thread(referee,"referee").start();
new Thread(rabbit, "兔子").start();
new Thread(tortoise, "乌龟").start();
}
}
执行结果
请输入这场比赛的距离: 100
倒计时:3秒
倒计时:2秒
倒计时:1秒
倒计时:0秒
砰!!!比赛开始!
现在兔子已经距离终点只剩100米
现在兔子已经距离终点只剩99米
现在乌龟已经距离终点只剩100米
现在兔子已经距离终点只剩98米
.....
现在乌龟已经距离终点只剩68米
现在乌龟已经距离终点只剩67米
现在乌龟已经距离终点只剩66米
现在乌龟已经距离终点只剩65米
现在乌龟已经距离终点只剩64米
现在乌龟已经距离终点只剩63米
现在乌龟已经距离终点只剩62米
......
现在乌龟已经距离终点只剩45米
......
现在乌龟已经距离终点只剩11米
现在乌龟已经距离终点只剩10米
现在兔子已经距离终点只剩20米
现在兔子已经距离终点只剩19米
......
现在乌龟已经距离终点只剩2米
现在兔子已经距离终点只剩3米
现在兔子已经距离终点只剩2米
现在兔子已经距离终点只剩1米
现在乌龟已经距离终点只剩1米
现在兔子已经距离终点只剩0米
恭喜兔子获得冠军!!!
兔子以微弱优势获得了胜利,但是并不是每次执行结果都会如此!我们让兔子在完成80%的赛程时选择了休息2秒。事实上跑的距离越短, 兔子赢的把握也就越低,反之赢的把握则越大!!!