您的位置:首页 > 职场人生

黑马程序员:如何结束线程及线程中的其他方法介绍:interrupt()、join()、yield()等方法

2013-11-04 19:56 441 查看
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

停止线程

stop()已过时

如何停止线程?

只有一种:run方法结束

开启多线程运行,运行代码通常是循环结构

所以通常只要控制循环,就可以让run方法结束,也就是线程结束

示例:

class StopThread implements Runnable
{
private boolean flag = true;
private int count = 1;
public synchronized void run()
{
while(flag)
{
System.out.println(Thread.currentThread().getName()+".....run"+flag+count++);
}
}
public void changeFlag()
{
flag = false;
}
}

class StopThreadDemo
{
public static void main(String[] args)
{
StopThread  s = new StopThread();
Thread t1 = new Thread(s);
Thread t2 = new Thread(s);
t1.start();
t2.start();
int num = 0;
while(true)
{
if (num++ == 60)
{
s.changeFlag();
break;
}
System.out.println("=================="+num);
}
System.out.println("main-over");
}
}


特殊情况:

当线程处于冻结状态,就都取不到标记,那么线程就不会结束

当没有指定的方式让冻结的线程恢复到运行状态时,就需要对冻结进行清除。

强制让线程恢复到运行状态中来,这样就可以让线程判断标记从而结束。

Thread类提供了该方法 interrupt()

示例:

class StopThread implements Runnable
{
private boolean flag = true;
private int count = 1;
public synchronized void run()
{
while(flag)
{
try
{
wait(); //t1、t2都wait()在这的情况
}
catch(InterruptedException e)
{
System.out.println(Thread.currentThread().getName()+"Exception");
flag = false;
}
System.out.println(Thread.currentThread().getName()+".....run"+flag+count++);
}
}
public void changeFlag()
{
flag = false;
}
}

class StopThreadDemo
{
public static void main(String[] args)
{
StopThread  s = new StopThread();
Thread t1 = new Thread(s);
Thread t2 = new Thread(s);
t1.start();
t2.start();
int num = 0;
while(true)
{
if (num++ == 60)
{
s.changeFlag();
t1.interrupt(); //interrupt(),Thread的方法,清除t1等待状态
t2.interrupt();	//清除t2等待状态
break;
}
System.out.println("=================="+num);
}
System.out.println("main-over");
}
}


Thread中的另一个方法 setDaemon(boolean on)

格式

setDaemon(boolean on);

示例:

t1.setDaemon(true); //t1线程标记为守护线程

当所有线程都是守护线程时,虚拟机退出。

注:需要在线程开启之前标记

示例

t1.setDaemon(true);

t1.start();

如上文中的代码,不使用interrupt()方法,也可以通过守护线程方法结束程序

当主线程结束完毕之后,而t1和t2线程都是守护线程,则虚拟机退出

Thread中的又一个方法:join();

join():等待该线程结束。

当A线程执行到了B线程的.join()方法时,A就会等待,直到B线程都执行完了,A才会继续执行,和其他线程无关

join可以用来临时加入线程执行。

示例:

class Join implements Runnable
{
public void run()
{
for (int x=0; x<100; x++)
{
System.out.println(Thread.currentThread().getName()+"=====run"+x);
}
}
}
class JoinDemo
{
public static void main(String[] args) throws InterruptedException
{
Join j = new Join();
Thread t1 = new Thread(j);
Thread t2 = new Thread(j);
t1.start();
t1.join(); //当t1线程执行完run()后,主线程继续执行下面的代码。t1结束前,主线程处于冻结状态
t2.start();
for (int x=0; x<50; x++)
{
System.out.println(Thread.currentThread().getName()+"====="+x);
}
System.out.println("over");
}
}


toString();返回该线程的字符串表示形式,包括线程名称、优先级和线程组。

示例:

以字符串表示形式返回当前线程的信息 Thread.currentThread().toString();

Thread[Thread-0,5,main]

Thread[线程名称,优先级,线程组]

关于线程组:该线程由哪个线程开启的,就默认属于这个组,当然也可以加入到其他组

改变优先级的方法:

t1.setPriority(Thread.MAX_PRIORITY); //设置t1线程的优先级为最高级别

MAX_PRIORITY:最高级别 NORM_PRIORITY:默认级别MIN_PRIORITY:最低级别

Thread.yield();

暂停当前正在执行的线程对象,并执行其他线程。

若两个线程t1、t2同时执行run(),默认情况下是t1,t2线程随即由CPU执行

若在run()中加入Thread.yield();后,t1执行到此语句时,就会先暂停(释放执行权),这时t2就被CPU执行了。

多线程应用:

/*

假设循环体是各部分需要执行的内容,有3个循环体

要求多线程执行

*/

class ThreadDemo
{
public static void main(String[] args)
{
/*通过匿名内部类创建一个Thread的子类并通过start()开启线程*/
new Thread()
{
public void run()
{
for (int x=0; x<50; x++)
{
System.out.println(Thread.currentThread().getName()+"-------"+x);
}
}
}.start();

/*主线程循环体*/
for (int x=0; x<50; x++)
{
System.out.println(Thread.currentThread().getName()+"-------"+x);
}

/*通过匿名内部类创建一个Runnable接口的子类*/
Runnable r = new Runnable()
{
public void run()
{
for (int x=0; x<50; x++)
{
System.out.println(Thread.currentThread().getName()+"-------"+x);
}
}
};
new Thread(r).start(); //
}
}


----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐