摘要:方法返回当前线程的构造方法执行结果构造方法在初始化的过程中都是在主线程执行,后开启新线程执行。方法是事当前线程睡眠暂停毫秒。在睡眠过程中,线程会让出,但不会失去已锁定的资源。
上文介绍了Tread的实例方法,本文再介绍下Thread的静态方法。
currentThread()currentThread方法返回当前线程的Object
public class Thread1 extends Thread{ static{ System.out.println(Thread.currentThread().getName()+" --> static"); } public Thread1() { System.out.println(Thread.currentThread().getName()+" --> 构造方法"); } @Override public void run() { System.out.println(Thread.currentThread().getName()+" --> run"); } }
public static void main(String[] args) { Thread1 t1 = new Thread1(); t1.start(); }
执行结果:
main --> static main --> 构造方法 Thread-0 --> run
Thread1在初始化的过程中都是在主线程执行,start后开启新线程执行。
sleep()sleep方法是事当前线程睡眠(暂停)n毫秒。在睡眠过程中,线程会让出cpu,但不会失去已锁定的资源。
Thread t = new Thread(new Runnable() { @Override public void run() { try { Long t1 = System.currentTimeMillis(); System.out.println("start at:"+t1); Thread.sleep(2000); Long t2 = System.currentTimeMillis(); System.out.println("end at:"+t2); } catch (InterruptedException e) { e.printStackTrace(); } } }); t.start();
执行结果:
start at:1511096714406 end at:1511096716407
考虑到系统时间分配等因素,执行结果都会大于等于指定的毫秒数,但不会差太多。另外sleep方法会抛出InterruptedException 的异常,在上文中也有讲到。
yield()yield方法是让出cpu的使用,让出多少时间是不确定的。
public class YieldTest extends Thread{ public YieldTest(String name) { super(name); } @Override public void run() { for (int i = 1; i <= 50; i++) { System.out.println("" + this.getName() + "-----" + i); if (i == 30) { this.yield(); } } } public static void main(String[] args) { YieldTest yt1 = new YieldTest("张三"); YieldTest yt2 = new YieldTest("李四"); yt1.start(); yt2.start(); } }
部分的执行结果:
...... 张三-----28 张三-----29 张三-----30 李四-----17 李四-----18 李四-----19 李四-----20 .....
当然每次执行的结果可能都不一样,这里可以看在执行到i==30时,"张三"让出了cpu使用,"李四"则开始执行。
interrupted()返回当前线程是否被中断,实现就是
return currentThread().isInterrupted(true);holdsLock(Object obj)
holdsLock是判断某个资源是否被线程锁定,
public class Thread1 extends Thread{ private Object obj = new Object(); @Override public void run() { synchronized (obj) { System.out.println("holdsLock1="+Thread.holdsLock(obj)); } System.out.println("holdsLock2="+Thread.holdsLock(obj)); } }
public static void main(String[] args) { Thread1 t1 = new Thread1(); t1.start();
执行结果:
holdsLock1=true holdsLock2=false
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70667.html
摘要:程序执行时,至少会有一个线程在运行,这个运行的线程被称为主线程。程序的终止是指除守护线程以外的线程全部终止。多线程程序由多个线程组成的程序称为多线程程序。线程休眠期间可以被中断,中断将会抛出异常。 线程 我们在阅读程序时,表面看来是在跟踪程序的处理流程,实际上跟踪的是线程的执行。 单线程程序 在单线程程序中,在某个时间点执行的处理只有一个。 Java 程序执行时,至少会有一个线程在运行...
摘要:同步代码块二类,锁是小括号中的类对象对象。因为对于同一个实例对象,各线程之间访问其中的同步方法是互斥的。优化同步代码块的方式有,减少同步区域或减小锁的范围。 版权声明:本文由吴仙杰创作整理,转载请注明出处:https://segmentfault.com/a/1190000009225706 1. 引言 在 Java 多线程编程中,我们常需要考虑线程安全问题,其中关键字 synchro...
摘要:非静态方法以及方法内部的代码块持有的是同一个对象锁,它们是同步执行的。可重入锁使用时,当一个线程请求一个对象锁时,再次请求该锁是可以立即得到的。出现异常,会自动释放锁同步方法与同步代码块作用于整个方法,可能引起方法执行效率下降。 synchronize可以在多个线程操作同一个成员变量或者方法时,实现同步(或者互斥)的效果。synchronized可以作用于方法,以及方法内部的代码块。 ...
摘要:多线程进程正在进行中的程序。所以容易出现线程安全问题。等待唤醒机制涉及的方法将同步中的线程处于冻结状态。返回该线程的字符串表示形式,包括线程名称优先级和线程组。暂停当前正在执行的线程对象,并执行其他线程。 多线程:进程:正在进行中的程序。其实进程就是一个应用程序运行时的内存分配空间。线程:其实就是进程中一个程序执行控制单元,一条执行路径。进程负责的是应用程序的空间的标示。线程负责的是应...
摘要:当多个线程访问实例时,每个线程维护提供的独立的变量副本。而则从另一个角度来解决多线程的并发访问。在执行同步代码块的过程中,遇到异常而导致线程终止。在执行同步代码块的过程中,其他线程执行了当前对象的方法,当前线程被暂停,但不会释放锁。 一、Thread.start()与Thread.run()的区别通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有...
阅读 1671·2023-04-26 02:30
阅读 1003·2021-11-10 11:36
阅读 1344·2021-10-08 10:14
阅读 3459·2021-09-28 09:35
阅读 1505·2021-08-23 09:47
阅读 2482·2019-08-30 15:56
阅读 1431·2019-08-30 15:44
阅读 1680·2019-08-30 13:59