文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java如何实现多线程Thread

2023-05-30 19:47

关注

这篇文章将为大家详细讲解有关java如何实现多线程Thread,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

start()

我们先来看看API中对于该方法的介绍:

使该线程开始执行;Java 虚拟机调用该线程的 run 方法。

结果是两个线程并发地运行;当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法)。

多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。

用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。

start方法是开启线程的方法,使用后java会创建一个新的线程执行run里的方法。这是一个小demo:

for(int i=0;i<3;i++){      Thread t= new Thread(new Runnable() {        @Override        public void run() {      System.out.println(Thread.currentThread().getName()+" start");          try {            Thread.sleep(1000);          } catch (InterruptedException e) {            e.printStackTrace();          }      System.out.println(Thread.currentThread().getName()+" end");        }      });      t.start();    }    System.out.println("it is over");

执行结果:
it is over
Thread-1 start
Thread-0 start
Thread-2 start
Thread-0 end
Thread-1 end
Thread-2 end

由于多线程是有随机性的,所以每次的结果可能都不一样,这一点也是我们需要注意的,线程的执行顺序和调用顺序并不一致。

run()

run方法就是调用Thread设置的Runnable的run方法,将上面的demo进行修改:

for(int i=0;i<3;i++){      Thread t= new Thread(new Runnable() {                @Override        public void run() {      System.out.println(Thread.currentThread().getName()+" start");          try {            Thread.sleep(1000);          } catch (InterruptedException e) {            e.printStackTrace();          }      System.out.println(Thread.currentThread().getName()+" end");        }      });      t.run();    }    System.out.println("it is over");

执行结果:
main start
main end
main start
main end
main start
main end
it is over
run方法的直接结果和start有很大的差别,完全是按顺序执行,并没有开启新线程。

stop()

stop方法是强制停止线程的执行,是非安全的,不要使用此方法。在调用stop时, 会对锁定的资源进行释放,但这种释放是非一致的,容易引起程序问题。如果想要控制线程的停止,可以使用自定义变量来判断或者isInterrupted()方法:

class Thread1 extends Thread {  @Override  public void run() {    //判断线程体是否运行    while (!isInterrupted()) {      // Do Something    }  }  }

interrupt()

interrupt的作用是通知线程,你已经被中断的,但具体的中断执行需要在线程自定义处理,甚至你可以不理会继续执行。具体的中孤单是会线程执行join、wait、sleep方法时,抛出InterruptedException。

Thread t1 = new Thread(new Runnable() {        @Override        public void run() {            System.out.println(Thread.currentThread().getName()+" start");            try {              for(int i=0;i<100000;i++){                System.out.println(i+"");                Thread.sleep(1);              }            } catch (InterruptedException e) {              System.out.println("the thread is interrupted");//可以在这里做资源释放,日志记录等              e.printStackTrace();            }            System.out.println(Thread.currentThread().getName()+" end");          }      });      t1.start();      Thread.sleep(100);      t1.interrupt();

执行结果:

65666768the thread is interruptedjava.lang.InterruptedException: sleep interruptedThread-0 end  at java.lang.Thread.sleep(Native Method)  at com.wk.aqi.act.Test$1.run(Test.java:23)  at java.lang.Thread.run(Thread.java:745)

isInterrupted()

判断线程是否中断,在执行上面的interrupt方法后,会return true。

setPriority(int newPriority)和getPriority()
设置线程的优先级和获取线程的优先级,cpu分配的资源给侧重给priority高的线程。

Thread t1 = new Thread(new Runnable() {        @Override        public void run() {            long t = System.currentTimeMillis();            System.out.println(Thread.currentThread().getName()+" start");            for(int i=0;i<1000;i++){              try {                Thread.sleep(1);              } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();              }            }            System.out.println(Thread.currentThread().getName()+" t1 end "+(System.currentTimeMillis()-t));          }      });      Thread t2 = new Thread(new Runnable() {        @Override        public void run() {          long t = System.currentTimeMillis();          System.out.println(Thread.currentThread().getName()+" start");          for(int i=0;i<1000;i++){            try {              Thread.sleep(1);            } catch (InterruptedException e) {              // TODO Auto-generated catch block              e.printStackTrace();            }          }          System.out.println(Thread.currentThread().getName()+" t2 end "+(System.currentTimeMillis()-t));        }      });      t1.setPriority(10);      t2.setPriority(1);      t2.start();      t1.start();

执行结果:

Thread-0 startThread-1 startThread-0 t1 end 1357Thread-1 t2 end 1371

在优先级一样的情况下,t1和t2是几乎同时完成的,在优先级不一样的情况,有明显的差别。

getName()

比较简单,获取线程的名称。

join()和join(long millis)

jion方法的作用是等待线程执行完成,join(long millis)可以设置最长等待时间。比如主线程需要等待子线程完成,获取子线程的结果后才能继续往下执行,这时候就可以使用join方法

Thread t1 = new Thread(new Runnable() {      @Override      public void run() {          long t = System.currentTimeMillis();          System.out.println(Thread.currentThread().getName()+" start");          try {            Thread.sleep(1000);          } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();          }          System.out.println(Thread.currentThread().getName()+" t1 end "+(System.currentTimeMillis()-t));        }    });    t1.start();    t1.join();    System.out.println("等待t1执行完,再执行");

执行结果:

Thread-0 startThread-0 t1 end 1001等待t1执行完,再执行

关于“java如何实现多线程Thread”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯