创建线程方式1:继承Thread类
1.继承Thread类
2.重写run()方法
3.实例化Thread1
4.使用start()方法启动线程
5.由CPU来安排什么时候执行线程
public class Thread1 extends Thread{
@Override
public void run(){
for (int i = 1; i <= 20; i++) {
System.out.println("run方法-" + i);
}
}
public static void main(String[] args) {
Thread1 tt1 = new Thread1();
tt1.start();
Thread1 tt2 = new Thread1();
tt2.start();
for (int i = 1; i <= 20; i++) {
System.out.println("主线程-" + i);
}
}
}
执行结果
run方法-1
run方法-2
run方法-3
run方法-4
run方法-5
主线程-1
主线程-2
主线程-3
主线程-4
主线程-5
run方法-1
run方法-2
run方法-3
run方法-4
run方法-5
什么时候执行看CPU心情
文件下载实例
导入commons-io.jar包
DownLoad.java
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
//1.继承Thread类
public class DownLoad extends Thread {
private final String url;
private final String filename;
//1.5类构造器(类方法)
public DownLoad(String url, String filename) {
this.url = url;
this.filename = filename;
}
//2.重写run()方法
@Override
public void run() {
//2.5实例化WebDownloader
WebDownloader wdl = new WebDownloader();
//3.0执行下载方法
wdl.downloader(url, filename);
System.out.println("下载的文件名为:" + filename);
}
public static void main(String[] args) {
//4.主线程创建方法对象
DownLoad t1 = new DownLoad("https://www.baidu.com/img/PC_880906d2a4ad95f5fafb2e540c5cdad7.png", "logo1.png");
DownLoad t2 = new DownLoad("https://www.baidu.com/img/PC_880906d2a4ad95f5fafb2e540c5cdad7.png", "logo2.png");
DownLoad t3 = new DownLoad("https://www.baidu.com/img/PC_880906d2a4ad95f5fafb2e540c5cdad7.png", "logo3.png");
//5.调用start()方法执行
t1.start();
t2.start();
t3.start();
}
}
//0下载器
class WebDownloader {
//0.5下载方法
public void downloader(String url, String filename) {
try {
FileUtils.copyURLToFile(new URL(url), new File(filename));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常,downloader方法出现问题");
}
}
}
执行结果
下载的文件名为:logo2.png
下载的文件名为:logo1.png
下载的文件名为:logo3.png
可见线程当中执行的顺序
也是由CPU决定和分配的
创建线程方式2:实现Runnable接口
推荐使用Runnable接口
public class Thread3 implements Runnable {
@Override
public void run() {
//run()方法线程体
for (int i = 1; i <= 5; i++) {
System.out.println("run方法-" + i);
}
}
public static void main(String[] args) {
//创建Runnable接口实现类对象
Thread3 thread3 = new Thread3();
//创建线程对象,通过线程对象来开启线程
new Thread(thread3).start();
for (int i = 1; i <= 5; i++) {
System.out.println("主线程-" + i);
}
}
}
执行结果
主线程-1
主线程-2
主线程-3
主线程-4
主线程-5
run方法-1
run方法-2
run方法-3
run方法-4
run方法-5
多线程同时操作同一个对象
Ticket.java
public class Ticket implements Runnable {
private int ticketNums = 10;
@Override
public void run() {
while (true) {
if (ticketNums <= 1) {
break;
}
//模拟延时
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "-->拿到了第" + ticketNums-- + "张票");
}
}
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(ticket, "小明").start();
new Thread(ticket, "老师").start();
new Thread(ticket, "黄牛").start();
}
}
执行结果线程不安全
老师-->拿到了第10张票
小明-->拿到了第9张票
黄牛-->拿到了第8张票
老师-->拿到了第7张票
小明-->拿到了第6张票
黄牛-->拿到了第5张票
老师-->拿到了第4张票
小明-->拿到了第3张票
黄牛-->拿到了第2张票
老师-->拿到了第1张票
有可能同时拿到同一张票,数据错乱
龟兔赛跑实例
//模拟龟兔赛跑
public class Race implements Runnable {
//3.胜利者
private static String winner;
@Override
public void run() {
//执行线程
//1.跑多少路程
for (int i = 0; i <= 10; i++) {
//7.让兔子睡觉
// 7.1线程的名字是如果是兔子 并且 i能被10整除的时候,就让兔子休息
if (Thread.currentThread().getName().equals("兔子") && i % 10 == 0) {
try {
Thread.sleep(10); //7.2让兔子睡觉10毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//5.判断比赛是否结束
boolean flag = gameOver(i);
if (flag) {
break;
}
System.out.println(Thread.currentThread().getName() + "--跑了" + i + "步");
}
}
//2.判断是否完成比赛
private boolean gameOver(int steps) {
//4.判断胜利者是谁?
if (winner != null) { //4.1如果有胜利者了,返回true,比赛结束
return true;
} else if (steps >= 10) { //4.2否则,判断>=多少步
winner = Thread.currentThread().getName(); //4.3将线程的名字给winner
System.out.println(winner + "获胜");
return true;
} else {
return false;
}
}
//6.主程序
public static void main(String[] args) {
//6.1实现Runnable接口对象
Race race = new Race();
//6.2启动线程,把对象丢进线程里面,
new Thread(race, "兔子").start();
new Thread(race, "乌龟").start();
}
}
执行结果
乌龟--跑了0步
乌龟--跑了1步
乌龟--跑了2步
乌龟--跑了3步
乌龟--跑了4步
乌龟--跑了5步
乌龟--跑了6步
乌龟--跑了7步
乌龟--跑了8步
乌龟--跑了9步
乌龟获胜