java线程

Thread.currentThread方法

Thread的静态方法currentThread方法可以用于获取运行当前代码片段的线程。

Thread current = Thread.currentThread();

public class CurrentThreadDemo {
public static void main(String[] args) {
//获取运行main方法的线程
Thread main = Thread.currentThread();
System.out.println("运行main方法的线程是:" + main);
}
}

输出:Thread[main,5,main]

分别输出的是:线程名字,线程优先级,线程所在的组。

系统自动给线程去的名字是Thread-0,Thread-1

package thread;
/**
* sleep方法要求必须处理终端异常:InterruptedException
* 当我们调用一个线程的interrupted方法时,可以中断一个
* 正在运行的线程,但是若该线程正处于阻塞时,那么调用该方法并不是
* 中断开线程,而仅是中断其阻塞状态,这是会抛出异常,
* 通知程序该线程的阻塞状态被中断。
*
* @author 小明
*
*/
public class SleepDemo2 {
public static void main(String[] args) {
Thread lin = new Thread(){
public void run()
{
System.out.println("林:刚美完容,谁一会吧");
try {
/**
* 在阻塞过程中当前线程被中断,那么
* 会中断阻塞状态并抛出异常
*/
Thread.sleep(1000*60*60);
} catch (InterruptedException e) {
System.out.println("林:干嘛呢!干嘛呢!都破了相了");
}
System.out.println("林:醒了");
}
};

Thread huang = new Thread(){
public void run()
{
System.out.println("黄:开始砸墙!");
for(int i = 0; i < 5; i++)
{
System.out.println("黄:80!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("咣当!");
System.out.println("黄:搞定!");
lin.interrupt();
//这里不要写成lin.interrupted()了
}
};

lin.start();
huang.start();
}
}

main线程一定一个前台线程。因为守护线程在没有前台线程的情况下会自动结束运行。

main线程是最先结束了。

package thread;
/**
* 守护线程
* 守护线程又称为后台线程。默认创建出来的线程都是前台线程
* 后台线程是需要在线程启动前单独进行设置的。
* 设置的方法为:
* void setDaemon(boolean on)
* 当参数为true时,该线程被设置为守护线程(后台线程)
*
* 在使用上前台线程与后台线程没有什么区别,但是在结束实际上有一个不同
* 即:当进程结束时,所有还在运行的守护线程都会被强制中断。
* 进程的结束:当一个进程中的所有前台线程都结束时,进程结束。
*
* 只要没有前台进程了,守护线程就会强制被结束。守护的是前台线程。
*
* @author 小明
*
*/
public class DaemonThreadDemo {
public static void main(String[] args) {
Thread rose = new Thread(){
public void run()
{
for(int i = 0; i < 5; i++)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("跳");
}
System.out.println("噗通!");
}
};

Thread jack = new Thread(){
public void run()
{
while(true)
{
try {
Thread.sleep(1000);
System.out.println("jack:you junmp!");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}
};
jack.setDaemon(true);//设置为守护线程。
rose.start();
jack.start();
// /*while(true)
// {
// //如果主线程还没有结束,那么守护线程是不会结束的。因为主线程是前台进程。
// }*/

System.out.println("main线程结束了!");
}
}

main线程结束了不代表程序结束了,只要还有线程池中所有线程结束了,程序才结束。

只要还有前台线程没有结束,程序就不会结束。

yield方法

调用这个方法,主动让出CPU时间片。

该方法用于使当前线程主动让出当次CPU时间片回到Runnable状态,等待分配时间片。

join方法

Thread的方法join:

--void join()
该方法用于等待当前线程结束。

该方法声明抛出InterruptException。

单线程就是同步执行。

join()允许一个线程在另一个线程结束之后再运行。

原文地址:https://www.cnblogs.com/liaoxiaolao/p/9597581.html