Thread

三种创建方式

  • 继承Thread类
 public class ThreadTest extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println("run线程"+i);
      }
  }
    public static void main(String[] args){
        ThreadTest threadTest = new ThreadTest();
        threadTest.start();
        for (int i = 0; i < 20; i++) {
            System.out.println("main线程"+i);
      }
  }
}
- 实现Runnable接口public class ThreadTest3 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i <20 ; i++) {
            System.out.println("线程执行---"+i);
      }
  }
 
    public static void main(String[] args) {
        ThreadTest3 threadTest3 = new ThreadTest3();
        new Thread(threadTest3).start();
 
        for (int i = 0; i < 20; i++) {
            System.out.println("main线程---"+i);
 
      }
  }
}
  • 实现Callable接口(可以抛出异常,可以由返回值)
public class ThreadTest5 implements Callable<Boolean> {
  private String url;
  //名字
  private String name;
 
  public ThreadTest5(String url, String name) {
      this.url = url;
      this.name = name;
}
  @Override
  public Boolean call() throws Exception {
      WebDownloader webDownloader = new WebDownloader();
      webDownloader.downloader(url, name);
      System.out.println("下载了文件名:" + name);
      return true;
}
  public static void main(String[] args) throws ExecutionException, InterruptedException {
      ThreadTest5 t1 = new ThreadTest5("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1593148788935&di=ca5d0715732ee73c52a8196a08ac711f&imgtype=0&src=http%3A%2F%2Ft9.baidu.com%2Fit%2Fu%3D3363001160%2C1163944807%26fm%3D79%26app%3D86%26f%3DJPEG%3Fw%3D1280%26h%3D830", "图片1.jpg");
      ThreadTest5 t2 = new ThreadTest5("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1593148788935&di=ca5d0715732ee73c52a8196a08ac711f&imgtype=0&src=http%3A%2F%2Ft9.baidu.com%2Fit%2Fu%3D3363001160%2C1163944807%26fm%3D79%26app%3D86%26f%3DJPEG%3Fw%3D1280%26h%3D830", "图片2.jpg");
      ThreadTest5 t3 = new ThreadTest5("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1593148788935&di=ca5d0715732ee73c52a8196a08ac711f&imgtype=0&src=http%3A%2F%2Ft9.baidu.com%2Fit%2Fu%3D3363001160%2C1163944807%26fm%3D79%26app%3D86%26f%3DJPEG%3Fw%3D1280%26h%3D830", "图片3.jpg");
      //创建执行服务
      ExecutorService service = Executors.newFixedThreadPool(3);
      //提交执行
      Future<Boolean> r1 = (Future<Boolean>) service.submit(t1);
      Future<Boolean> r2 = (Future<Boolean>) service.submit(t2);
      Future<Boolean> r3 = (Future<Boolean>) service.submit(t3);
      //获取结果
      boolean rs1 = r1.get();
      boolean rs2 = r2.get();
      boolean rs3 = r3.get();
      //关闭服务
      service.shutdownNow();
}
}

注:

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

线程状态

创建状态

就绪状态

阻塞状态

运行状态

死亡状态

线程休眠(sleep)

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

线程礼让(yield)

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

线程合并(join)

  • join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞

线程优先级

  • setPriority设置线程优先级

守护(daemon)线程

  • 线程分为用户线程和守护线程
  • 虚拟机必须确保用户线程执行完毕
  • 虚拟机不用等待守护线程执行完毕
  • 如,后台记录操作日志,监控内存,垃圾回收等待

线程同步

synchronized和Lock(ReentrantLock)的对比

  • Lock是显式锁(手动开启和关闭),synchronized是隐式锁,出了作用域自动释放
  • Lock只有代码块锁,synchronized代码块锁和方法锁
  • 使用Lock锁,JVM将花费较少的时间来调度线程,性能更好,并且具有更好的拓展性(提供更多的子类)
  • 优先使用顺序Lock>同步代码块(已经进入了方法体,分配了相应资源)>同步方法(在方法体之外)

线程协作

管程法
信号灯法

本文系作者 @ 原创发布在 IT梦。未经许可,禁止转载。

喜欢()
0 0 投票数
Article Rating
订阅评论
提醒
guest
1 评论
最旧
最新 最多投票
内联反馈
查看所有评论
热门搜索
31 文章
13 评论
83 喜欢
Top
1
0
希望看到您的想法,请您发表评论x