多线程的作用
能够创建多个线程,此外线程可以体现程序的动态性,提高效率,在抢票以及各种游戏之中具有非常重要的作用。(线程的魅力在坦克大战中体现的淋漓尽致)
多线程的知识体系
多线程的基本使用
创建线程对象
public class T1 implements Runnable {//实现Runnable接口
int count = 0;
@Override
public void run() {
while(true){
System.out.println("hello!"+(++count));
try{
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
if(count == 60){
break;
}
}
}
}
启动线程对象
T1 t1 = new T1();
//t1.run();//我为什么不直接run就好了,并没有真正地开线程
//正确的创建方式,创建一个thread对象,然后来启动进程
Thread thread1 = new Thread(t1);
thread1.start();
这里就会产生一个疑问,我为什么不直接用t1.run方法,反而要创建一个线程对象,然后再用start方法运行呢?
run方法就是一个普通方法,不会启动线程,真正实现start方法的是里面的start0的本地方法,该使用多线程的机制来调用run方法,这也是为什么得创建一个thread对象,因为为了启动start方法
Q:那么继承Thread方法和实现Runnable方法有何区别呢?
A:从本质上来看,两者没有区别,其实Thread也是实现了Runnable接口,但是实现Runnable方法避免了单继承的限制,因此建议使用。
线程常用方法
线程的礼让和插队方法
for(int i = 1; i <= 10;i++){
System.out.println("hi" + i)
if(i == 5){
t3.start();//启动主线程
t3.join();//插入到main线程中,让t3先执行
}
Thread.sleep(1000);
}
线程的同步机制
可以在需要控制同步的方法上加synchronized锁,保证同一时段只有一个程序运行,这个可以在售票机制方法中体现。
public class SellTicket implements Runnable {//我把这个叫做售票进程
private int tickNum = 100;
private Boolean loop = true;
//重新定义售票方法(我这里是在方法中实现的同步)
public synchronized void sell(){
if(tickNum <= 0){
System.out.println("售票结束!");
loop = false;//控制进程的运行
return;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("窗口"+Thread.currentThread().getName()+"售出一张票,剩余票数 "+(--tickNum));
}
@Override
public void run() {
while (loop) {
sell();
}
}
}
SellTicket sellTicket1 = new SellTicket();
System.out.println("开始卖票");
new Thread(sellTicket1).start();//就是同一个对象开3个线程?同一个卖票对象开3个线程?-这就是多线程的意义
new Thread(sellTicket1).start();
new Thread(sellTicket1).start();
标签:Runnable,Java,Thread,Robyn,start,线程,多线程,方法
From: https://www.cnblogs.com/robyn2022/p/16730479.html