#线程
日期:2020-12-30
学习:线程(详解)
发现:在Tread中发现下面这句话,关键字为volatile
“private volatile String name;”
解释:volatilev是一个特征修饰符(type specifier).volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了 ;
内容:
- 在继承父类和接口时,执行start()都只能执行一次,否则会报错,但是仍会执行一次。
涉及多线程时,执行的优先级没有设定的情况下,执行的顺序没有固定的排列,每次执行都是不一样的结果。 - 对于多个线程同时处于执行状态时,为了区分线程,下面的方法是获取线程名:
public class Demo4 {
/**
* 功能:模拟售票
*
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//定义售票窗口
TicketWindow tw1 = new TicketWindow();
//创建三个线程
Thread t1 = new Thread(tw1);
Thread t2 = new Thread(tw1);
Thread t3 = new Thread(tw1);
//启动三个线程
t1.start();
t2.start();
t3.start();
}
}
//窗口售票类
class TicketWindow implements Runnable {
//一共有2000张票
private int nums = 2000;
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
//出票速度是一秒出一张
try {
Thread.sleep(500);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
synchronized (this){
//先判断是否还有票
if (nums > 0) {
//显示售票信息
System.out.println("在售出第 " + nums + " 张票" + "--"
+ Thread.currentThread().getName());//得到当前线程名称
nums--;
} else {
//售票结束
break;
}
}
}
}
}
- 由于多线程同时执行时会出现类似于多窗口抢同一张票,此时使用一个类似于锁的概念,对于一张票,只能有一张窗口购票结束,才能由别的线程继续抢票,不会出现抢同一张票:
synchronized (this){
//执行的操作,例如抢票时,抢到就票数减一
}
【拓展】Java多线程——线程的优先级和生命周期
首先,线程的优先级并不是优先级越高就一定首先执行,只能改变被优先执行的概率。