摘要:之前有简单介绍过多线程的使用,已经类和类,为了更好地理解多线程,本文就进行详细的分析。方法是强制停止线程的执行,是非安全的,不要使用此方法。比较简单,获取线程的名称。和方法的作用是等待线程执行完成,可以设置最长等待时间。
之前有简单介绍过java多线程的使用,已经Thread类和Runnable类,为了更好地理解多线程,本文就Thread进行详细的分析。
start()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时, 会对锁定的资源进行释放,但这种释放是非一致的,容易引起程序问题。如果想要控制线程的停止,可以使用自定义变量来判断或者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();
执行结果:
65 66 67 68 the thread is interrupted java.lang.InterruptedException: sleep interrupted Thread-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 start Thread-1 start Thread-0 t1 end 1357 Thread-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 start Thread-0 t1 end 1001 等待t1执行完,再执行
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70679.html
摘要:程序执行时,至少会有一个线程在运行,这个运行的线程被称为主线程。程序的终止是指除守护线程以外的线程全部终止。多线程程序由多个线程组成的程序称为多线程程序。线程休眠期间可以被中断,中断将会抛出异常。 线程 我们在阅读程序时,表面看来是在跟踪程序的处理流程,实际上跟踪的是线程的执行。 单线程程序 在单线程程序中,在某个时间点执行的处理只有一个。 Java 程序执行时,至少会有一个线程在运行...
摘要:一线程的基本概念单线程简单的说,单线程就是进程中只有一个线程。多线程由一个以上线程组成的程序称为多线程程序。当线程调用完方法进入后会自动释放锁,线程获得锁。 一、线程的基本概念 1.1 单线程 简单的说,单线程就是进程中只有一个线程。单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。 Java示例: public class SingleThrea...
摘要:返回与此锁相关联的给定条件等待的线程数的估计。查询是否有线程正在等待获取此锁。为公平锁,为非公平锁线程运行了获得锁定运行结果公平锁的运行结果是有序的。 系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 ...
摘要:这种方式实现多线程很简单,通过自己的类直接,并复写方法,就可以启动新线程并执行自己定义的方法。 JAVA多线程实现方式主要有两种:继承Thread类、实现Runnable接口。 1、继承Thread类实现多线程 继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过...
摘要:上下文切换会影响到线程的执行速度,对于系统来说意味着会消耗大量的时间减少上下文切换的方式无锁并发编程,在多线程竞争锁时,会导致大量的上下文切换。线程在中的使用在中实现多线程的方式比较简单,因为中提供了非常方便的来实现多线程。 文章简介 上一篇文章我们了解了进程和线程的发展历史、线程的生命周期、线程的优势和使用场景,这一篇,我们从Java层面更进一步了解线程的使用 内容导航 并发编程的...
摘要:同步代码块二类,锁是小括号中的类对象对象。因为对于同一个实例对象,各线程之间访问其中的同步方法是互斥的。优化同步代码块的方式有,减少同步区域或减小锁的范围。 版权声明:本文由吴仙杰创作整理,转载请注明出处:https://segmentfault.com/a/1190000009225706 1. 引言 在 Java 多线程编程中,我们常需要考虑线程安全问题,其中关键字 synchro...
阅读 2265·2021-09-27 13:35
阅读 561·2019-08-30 15:55
阅读 809·2019-08-30 15:53
阅读 554·2019-08-30 15:52
阅读 2145·2019-08-30 12:59
阅读 2268·2019-08-29 16:42
阅读 1384·2019-08-26 18:26
阅读 2466·2019-08-26 13:48