龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

Java线程的控制详解

时间:2014-11-01 02:27来源:网络整理 作者:网络 点击:
分享到:
这篇文章主要介绍了Java中的join线程、后台线程、线程睡眠、线程让步以及线程的优先级,非常的详细,希望能对大家有所帮助

1. join线程

在线程执行过程中,有时想让另一个线程先执行,比如将一大问题分割成许多小问题,给每一个小问题分配线程,但所有小问题处理完后再让主线程进一步操作。此时我们可以在主线程中调用其它线程的join()方法,以阻塞调用线程(在这里为主线程)。

示例代码:

复制代码 代码如下:

 package org.frzh.thread;
 
 public class JoinThread extends Thread{
     //提供一个有参构造器,用来设置线程的名字
     public JoinThread(String name) {
         super(name);
     }
    
     public void run() {
         for (int i = 0; i < 100; i++) {
             System.out.println(getName() + " " + i);
         }
     }
    
     public static void main(String[] args) {
         //启动子线程
         new JoinThread("新线程").start();
         for (int i = 0; i < 100; i++) {
             if (i == 20) {
                 JoinThread jt = new JoinThread("被join的线程");
                 jt.start();
                 //main线程调用了jt线程的join方法,则main线程必须等待jt执行完之后才能执行
                 try {
                     jt.join();
                 } catch (InterruptedException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
             }
             System.out.println(Thread.currentThread().getName() + " " +i);
         }
     }
 }

本来有三套线程(两条子线程和一main线程),当i=20后,main线程被阻塞必须等到“被join线程”执行完之后才有机会执行,所以此后只有两条线程执行。

join()方法的三种重载形式:

join():等待被join线程执行完;

join(long millis):等待被join线程执行最长为mills豪秒,在这之后即使被join线程没有执行完也不再等待;

join(long millis, int nanos):等待被join线程执行最长时间为millis毫秒+nanos微秒。(此方法基本用不上)。

2:后台线程

有一种线程,他是在后台运行,他的任务是为其他线程服务,这种线程被称为“后台线程”、“守护线程”或“精灵线程”。当所有前台线程都死亡后,后台线程会自动死亡。

示例代码:

复制代码 代码如下:

 package org.frzh.thread;
 
 public class DaemonThread extends Thread{
     public void run() {
         for (int i = 0; i < 1000; i++) {
             System.out.println(getName() + " " +i);
         }
     }
    
     public static void main(String[] args) {
         DaemonThread dt = new DaemonThread();
         //将此线程设置为后台线程
         dt.setDaemon(true);
         dt.start();
         for (int i = 0; i < 10; i++) {
             System.out.println(Thread.currentThread().getName() + " " + i);
         }
         //前台线程结束,那么后台线程dt也会结束,所以它执行不到999
     }
 }

主线程默认是前台线程,前台线程创建的子线程默认是前台线程,后台线程创建的子线程默认是后台线程。

3.线程睡眠(sleep):

精彩图集

赞助商链接