回顾多线程

多线程

核心概念

  • 线程就是独立执行的路径
  • 在程序运行时,即使没有自己创建线程,后台也会有多个线程,eg:主线程、gc线程
  • main()函数为主线程,为系统的入口,用于执行整个程序
  • 一个进程中,如果开辟了多线程,线程的运行由机器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能够认为的干预的
  • 对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制
  • 线程会带来额外的开销,如CPU调度时间,并发控制开销
  • 每个线程在自己的工作内存中交互,内存控制不当会造成数据不一致

创建线程

线程开启不一定立即执行,由cpu来调度执行

继承Thread

public class ExtendTread extends Thread {
     

    @Override
    public void run() {
     

        for (int i = 0; i <50 ; i++) {
     
            System.out.println("method run ---" + i);
        }
    }

    /**
     * 主线程
     * @param args
     */
    public static void main(String[] args) {
     
        
        new ExtendTread().start();

        for (int i = 0; i <500 ; i++) {
     
            System.out.println("method main ---" + i);
        }
    }
}
  • 不建议使用,避免OOP(面向对象程序设计)单继承的局限性

实现Runnable

public class RunnableThread implements Runnable {
     

    @Override
    public void run() {
     
        for (int i = 0; i < 20; i++) {
     
            System.out.println("method run ---" + i);
        }
    }

    public static void main(String[] args) {
     
        new Thread(new RunnableThread()).start();

        for (int i = 0; i < 200; i++) {
     
            System.out.println("method main ---" + i);
        }
    }
}
  • 推荐使用,避免单继承的局限性,灵活方便,可以同一个对象被多个线程使用

实现Callable

  1. 实现Callable接口,需要返回值类型
  2. 重写call方法,需要抛出异常
  3. 创建目标对象
public class CallableThread implements Callable<Boolean> {
     

    public CallableThread() {
     

    }

    @Override
    public Boolean call() throws Exception {
     
        //线程操作
        return true;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
     
        //创建线程
        CallableThread callableThread = new CallableThread();
        //创建线程池
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        //提交执行
        Future<Boolean> rs =  executorService.submit(callableThread);
        //获取结果
        boolean res = rs.get();
        //关闭服务
        executorService.shutdown();
    }
}

线程停止

  • 线程方法
方法 说明
setPriority(int newPriority) 修改线程的优先级
static void sleep(long millis) 让当前执行的线程休眠
void join() 等待该线程终止
static native void yield(); 暂停当前执行的线程对象,并执行其他线程
void interrupt() 中断线程,一般不用
boolean isAlive() 判断线程是否处于存活状态

线程休眠

  • sleep(时间)指定当前线程阻塞的毫秒数
  • sleep存在中断异常InterruptedException
  • 时间到达后sleep,线程进入就绪状态
  • sleep可以模拟网络延时,倒计时等
  • 每个对象都有一个锁,sleep不会释放锁

线程礼让(yield)

  • 礼让线程,让当前执行的线程暂停,但不阻塞
  • 将线程从运行状态转为就绪状态
  • 让cup重新调度,礼让不一定成功!看cup心情

你可能感兴趣的:(java,java,thread)