一: 两种实现方式:
1.继承Thread类重写run方法
2.继承Runnable接口重写run方法(通常用这种,java单继承的局限性,后期还想继承其他类会无从下手)
二:简单demo1(多线程模拟买票)
package 多线程;
public class BuyTicket {
public static void main(String[] args) {
TickThread tt = new TickThread();
Thread t1 = new Thread(tt,"张三");
Thread t2 = new Thread(tt,"李四");
Thread t3 = new Thread(tt,"王五");
t1.start();
t2.start();
t3.start();
}
}
class TickThread implements Runnable{
private int total = 10;
@Override
public void run() {
while (total>=1) {
total--;
System.out.println(Thread.currentThread().getName() + "买了票,剩余" + total + "张");
}
System.out.println(Thread.currentThread().getName()+"发现售罄");
}
}
三 简单demo2(模拟龟兔赛跑)
package 多线程;
public class RunGame {
public static void main(String[] args) {
Runner rn = new Runner();
Thread rabbit = new Thread(rn,"rabbit");
Thread tortoise = new Thread(rn,"tortoise");
rabbit.start();
tortoise.start();
}
}
class Runner implements Runnable{
private int stage = 100;
private String winner=null;
@Override
public void run() {
for(int i=1;i<=100;i++){
if(isOver(i)==true) {
Thread.currentThread().interrupt();
break;
}
}
}
boolean isOver(int step){
if (winner!=null){
return true;
}else{
if(step==100){
System.out.println(Thread.currentThread().getName()+"胜利!");
winner=Thread.currentThread().getName();
return true;
}else{
System.out.println(Thread.currentThread().getName()+"->"+step);
return false;
}
}
}
}
三:线程五大状态:
1.新生
Thread rabbit = new Thread(rn,"rabbit");
Thread tortoise = new Thread(rn,"tortoise");
new 一个Thread后,将会分配线程所需的资源。
2.就绪
t.start();
调用start后,线程进入就绪等待队列,至于什么时候运行,CPU调度说的算。
3.运行
4.阻塞
wait() 不携带资源
sleep()携带资源
5.死亡
#run正常执行完毕,尽量不要调用stop去强行终止线程
四:join简单使用demo
Thread worker1 = new Thread(()->{
try {
for(int i=0;i<5;i++){
Thread.sleep(1000);
System.out.println("睡了"+(i+1)+"秒");
}
System.out.println("睡了一会,工作完成了");
} catch (InterruptedException e) {
e.printStackTrace();
}
},"worker1");
Thread worker2 = new Thread(()->{
try {
worker1.join();
System.out.println("员工2开始工作");
} catch (InterruptedException e) {
e.printStackTrace();
}
},"worker2");
worker1.start();
worker2.start();
五:yield与设置优先级
yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。
设置优先级只是具有较大的概率先执行,但不代表一定先执行。