欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

线程初学

程序员文章站 2022-03-06 12:16:56
#线程日期:2020-12-30学习:线程(详解)发现:在Tread中发现下面这句话,关键字为volatile“private volatile String name;”解释:volatilev是一个特征修饰符(type specifier).volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了 ;内容:在继承父类和接口时,执行start()都只能执...

#线程

日期:2020-12-30
学习:线程(详解)
发现:在Tread中发现下面这句话,关键字为volatile
“private volatile String name;”
解释:volatilev是一个特征修饰符(type specifier).volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了 ;
内容:

  1. 在继承父类和接口时,执行start()都只能执行一次,否则会报错,但是仍会执行一次。
    涉及多线程时,执行的优先级没有设定的情况下,执行的顺序没有固定的排列,每次执行都是不一样的结果。
  2. 对于多个线程同时处于执行状态时,为了区分线程,下面的方法是获取线程名:
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;
              }
          }

        }
    }

}
  1. 由于多线程同时执行时会出现类似于多窗口抢同一张票,此时使用一个类似于锁的概念,对于一张票,只能有一张窗口购票结束,才能由别的线程继续抢票,不会出现抢同一张票:
synchronized (this){
                //执行的操作,例如抢票时,抢到就票数减一
}

【拓展】Java多线程——线程的优先级和生命周期
首先,线程的优先级并不是优先级越高就一定首先执行,只能改变被优先执行的概率。

本文地址:https://blog.csdn.net/oh12138/article/details/111994126

相关标签: java 多线程