Java学习之路--thread--多线程相关

发布时间 2023-09-20 15:57:21作者: 寂灭无言
package com.thread;
/*
进程:一个进程里包含多个线程,程序运行起来就叫进程
线程:线程是程序中执行的线程
*/
public class Demo01 {
}

//
package com.thread;

//模拟龟兔赛跑
public class Race implements Runnable{

//胜利者
private static String winner;
private int steps;

@Override
public void run() {
for (int i = 0; i <= 100; i++) {

//模拟兔子睡觉
if (Thread.currentThread().getName().equals("兔子")){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//判断比赛是否结束
boolean flag = gameOver();
//如果比赛结束了,就停止程序
if (flag){
break;
}
System.out.println(Thread.currentThread().getName() + "-->跑了" + i + "步");
}
}

//判断是否完成比赛
private boolean gameOver(){
//判断是否有胜利者
if (winner != null){//已经存在胜利者了
return true;
}{
if (steps == 100){
winner = Thread.currentThread().getName();
System.out.println("胜利者是" + winner);
return true;
}
}
return false;
}

public static void main(String[] args) {
Race race = new Race();

new Thread(race,"兔子").start();
new Thread(race,"乌龟").start();
race.gameOver();
}
}

//
package com.thread;

//创建线程的方式一:继承Thread类,重写run()方法,调用start开启线程
/*
步骤:
1,自定义线程类继承Thread类
2.重写run()方法,编写线程执行体
3.创建线程对象,调用start()方法启动线程
*/
//总结==注意,线程开启不一定立即执行,有CPU调度执行
public class TestThread extends Thread{
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 20; i++) {
System.out.println("我在看代码---" + i);
}
}

public static void main(String[] args) {
//main主线程,主线程

//创建一个线程对象
TestThread testThread = new TestThread();

//调用start()方法开启线程
testThread.start();

for (int i = 0; i < 20; i++) {
System.out.println("我在学习多线程--" + i);
}
}
}

//
//package com.thread;
//
//
//
//import sun.reflect.misc.FieldUtil;
//import org.apache.commons.io.FileUtils;
//
//import java.io.File;
//import java.io.IOException;
//import java.net.URL;
//
////练习Thread,实现多线程同步下载图片
//public class TestThread2 extends Thread{
// private String url; //网络图片地址
// private String name; //保存的文件名
//
// public TestThread2(String url, String name) {
// this.url = url;
// this.name = name;
// }
//
// //下载图片线程的执行体
// @Override
// public void run() {
// WebDownloader webDownloader = new WebDownloader();
// webDownloader.downloader(url,name);
// System.out.println("下载的文件名为:" + name);
// }
//
// public static void main(String[] args) {
// TestThread2 t1 = new TestThread2("https://ts1.cn.mm.bing.net/th/id/R-C.1287cf86af4c145c01e92cae3c4d13f7?rik=%2b2GZSYvwT96NCQ&riu=http%3a%2f%2fimg.ewebweb.com%2fuploads%2f20200103%2f07%2f1578006235-prqbKVnPMv.jpg&ehk=HBA7EvJHLk2XuZe9ZuKIvUPeiusTrc8gW0DSK7Vt1%2fg%3d&risl=&pid=ImgRaw&r=0","1.jpg");
// TestThread2 t2 = new TestThread2("https://ts1.cn.mm.bing.net/th/id/R-C.1287cf86af4c145c01e92cae3c4d13f7?rik=%2b2GZSYvwT96NCQ&riu=http%3a%2f%2fimg.ewebweb.com%2fuploads%2f20200103%2f07%2f1578006235-prqbKVnPMv.jpg&ehk=HBA7EvJHLk2XuZe9ZuKIvUPeiusTrc8gW0DSK7Vt1%2fg%3d&risl=&pid=ImgRaw&r=0","2.jpg");
// TestThread2 t3 = new TestThread2("https://ts1.cn.mm.bing.net/th/id/R-C.1287cf86af4c145c01e92cae3c4d13f7?rik=%2b2GZSYvwT96NCQ&riu=http%3a%2f%2fimg.ewebweb.com%2fuploads%2f20200103%2f07%2f1578006235-prqbKVnPMv.jpg&ehk=HBA7EvJHLk2XuZe9ZuKIvUPeiusTrc8gW0DSK7Vt1%2fg%3d&risl=&pid=ImgRaw&r=0","3.jpg");
//
// t1.start();
// t2.start();
// t3.start();
// }
//}
//
////下载器
//class WebDownloader {
// //下载方法
// public void downloader(String url, String name){
// try {
//// FileUtils.copyURLToFile(new URL(url),new File(name));
// FieldUtil.getField(new URL(url), new File(name));
// } catch (IOException e) {
// e.printStackTrace();
// System.out.println("IO异常,downloader方法出现问题");
// }
// }
//}

//
package com.thread;

//创建线程方式2:实现Runnable接口
//重写run方法,执行线程需要丢人runnable接口实现类,调用start方法
/*
步骤
1.定义MyRunnable类实现runnable接口,
2.实现run()方法,编写线程执行体
3.创建线程对象,调用start()方法启动线程
*/
public class TestThread3 implements Runnable{
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 200; i++) {
System.out.println("我在看代码----" + i);
}
}

public static void main(String[] args) {
//创建runnable接口的实现类对象
TestThread3 testThread3 = new TestThread3();

// //创建线程对象,通过线程对象来开启我们的下线程,代理
// Thread thread = new TestThread();
//
// thread.start();
// testThread3.run();

new Thread(testThread3).start();

for (int i = 0; i < 1000; i++) {
System.out.println("我在学习多线程---" + i);
}
}
}
/*
小结:继承线程的两种方式
1.继承Thread类
(1)子类继承Thread类具备多线程能力
(2)启动线程:子类对象.start()
不建议使用:避免OOP单继承局限性

2.实现Runnable接口
(1)实现接口Runnable具有多线程能力
(2)启动线程:传入目标对象+Thread对象.start()
推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
*/

//
package com.thread;

//多个线程同时操作同一个对象
//买火车票的例子
//发现问题,多个线程操作哦同一个资源的情况下,线程不安全,数据紊乱
public class TestThread4 implements Runnable{

//票数
private int ticketNums = 10;
@Override
public void run() {
while (true) {
if (ticketNums <= 0){
break;
}
//模拟延时
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "-->拿到了第" + ticketNums + "张票");
}
}

public static void main(String[] args) {

TestThread4 ticket = new TestThread4();

new Thread(ticket,"小明").start();
new Thread(ticket,"老师").start();
new Thread(ticket,"黄牛党").start();
}
}