java复习

2020-07-09多线程

2020-07-09  本文已影响0人  智障猿

概念介绍

  1. 进程:正在运行的程序
  1. 线程:是进程中的单个顺序控制流,是一条执行路径
  1. 线程调度
    线程有两种调度模型

多线程的实现方式

  1. 为什么要重写run方法?
    因为run()是用来封装被线程执行的代码。
  2. run()与start()的区别?
    run:封装线程执行的代码,直接调用,相当于普通方法的调用。
    start:启动线程;然后由JVM调用此线程的run方法。

Thread类中设置和获取线程名称的方法

①void setName(String name):将此线程的名称改为等于参数name
②String getName():返回此线程的名称
③通过构造方法也可以设置线程名称。需要在自己创建的继承Thread的类中添加构造方法super()调用父类的构造方法

获取main()方法所在的线程名称

Thread类中的静态方法返回线程对象。
public static Thread currentThread():返回当前正在执行的线程对象的引用
Thread.currentThread().getName;

Thread类中设置和获取线程优先级的方法

线程控制

方法名 说明
static void sleep(long millis) 使当前正在执行的线程停留(暂停执行)指定的毫秒数(static修饰,使用Thread.sleep(1000)调用)
void join() 等待这个线程死亡
void setDaemon(boolean on) 将此线程标记为守护线程,当运行的线程都是守护线程时,java虚拟机将退出

线程生命周期

线程的生命周期.png

数据安全问题

synchronized(任意代码){
  多条语句操作共享数据代码
}

②synchronized(任意对象):就相当于给代码加锁了,任意对象可以看成一把锁

public class SellTicket implements Runnable {
    private int ticketCount = 100;
    private Object obj = new Object();
    @Override
    public void run() {
        while (true) {
            synchronized (obj) {//不要在这里new一个对象,相当于给每个线程加了不同的锁,每个进程依然能执行下面的代码
                if (ticketCount > 0) {
                    System.out.println(Thread.currentThread().getName() + "正在出售第" + ticketCount + "张电影票");
                    try {
                        Thread.currentThread().sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    ticketCount--;
                }
            }
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读