一、wait和sleep区别?

1.wait可以指定也可以不指定。sleep必须指定时间。

2.在同步中时,对cpu的执行权和锁的处理不同。它们都能将线程处于冻结状态。

wait:释放执行权,释放锁。

sleep:释放执行权,不释放锁。

二、线程的结束

1.调用该线程的stop()方法结束线程。容易导致不可预知的错误不推荐。

2.run()方法执行结束,线程正常结束,常用标志位来结束线程。

例:用标志位来结束线程

package com.test2;
class StopThread1 implements Runnable
{
private boolean flag=true;
public void run()
{
while(flag)
{
System.out.println(Thread.currentThread().getName()+"....");
}
} public void setFlag()
{
flag=false;
} } public class Demo2 {
public static void main(String[] args)
{
StopThread1 st=new StopThread1(); Thread t1=new Thread (st); t1.start();
int num=1;
for(;;)
{
if(++num==10)
{
st.setFlag();
break;
}
System.out.println("main"+num);
}
System.out.println("over");
}
}

问题:在上面代码加入wait()方法后,将线程处于冻结状态无法读取标记。如何结束呢?—可以使用interrupt

package com.test2;
class StopThread1 implements Runnable
{
private boolean flag=true;
public synchronized void run()
{
while(flag)
{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"....");
}
} public void setFlag()
{
flag=false;
} } public class Demo2 {
public static void main(String[] args)
{
StopThread1 st=new StopThread1();
Thread t1=new Thread (st);
t1.start();
int num=1;
for(;;)
{
if(++num==10)
{
st.setFlag();
break;
}
System.out.println("main"+num);
}
System.out.println("over");
}
}

3.使用interrupt来中断线程(其实是清除wait sleep中断状态)。
* Interrupt //可以将线程从冻结状态强制恢复到运行状态中来,让cpu具备执行资格。
* 但是强制动作会发生中断异常,记得要处理,(可在异常处理中设置标志),那么再次判断标志后就可以结束线程。

package com.test2;
class StopThread1 implements Runnable
{
private boolean flag=true;
public synchronized void run()
{
while(flag)
{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace(); }
System.out.println(Thread.currentThread().getName()+"....");
}
} public void setFlag()
{
flag=false;
} } public class Demo2 {
public static void main(String[] args)
{
StopThread1 st=new StopThread1(); Thread t1=new Thread (st);
Thread t2=new Thread (st);
t1.start();
t2.start();
int num=1;
for(;;)
{
if(++num==10)
{
st.setFlag();
t1.interrupt();
break;
}
System.out.println("main"+num);
}
System.out.println("over");
}
}

三、守护线程setDaemon()、join线程

1.当前台线程结束后,后台线程就会自动结束。

记住要在线程开启之前设置守护线程,不然会报错。

package com.test2;
class StopThread1 implements Runnable
{
private boolean flag=true;
public synchronized void run()
{
while(flag)
{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
flag=false;
}
System.out.println(Thread.currentThread().getName()+"....");
}
} } public class Demo2 {
public static void main(String[] args)
{
StopThread1 st=new StopThread1(); Thread t1=new Thread (st);
Thread t2=new Thread (st);
t1.start();
t2.setDaemon(true);
t2.start();
int num=1;
for(;;)
{
if(++num==10)
{
t1.interrupt();
break;
}
System.out.println("main"+num);
}
System.out.println("over");
}
}

2.join方法让一个现场当代另一个线程完成的方法——join()方法。当在某个程序执行流中调用其他线程的join方法时,

调用线程将被阻塞,知道join方法加入的join线程执行完为止。join方法适合将打的问题划分为小的问题,每个小问题分配

一个线程,小线程执行完后再调用主线程进一步处理。

3.toString()方法,返回该线程的字符串表现形式,包括线程名称、优先级和线程组。

4.yield()暂停当前正在执行的线程对象,并执行其他线程,注意它只是释放执行权,再次和其他线程抢夺线程。

典型面试题:

new Thread(new Runnable() {     //用匿名内部类创建线程
@Override
public void run() //父类线程任务
{
System.out.println("runnable run");
}
})
{public void run() //子类方法
{
System.out.println("subThread run"); //子类方法将父类方法覆盖 所以输出subThread run
  } }.start();

线程(三)__Interrupt 、setDaemon()、join的更多相关文章

  1. python笔记9-多线程Threading之阻塞(join)和守护线程(setDaemon)

    python笔记9-多线程Threading之阻塞(join)和守护线程(setDaemon) 前言 今天小编YOYO请xiaoming和xiaowang吃火锅,吃完火锅的时候会有以下三种场景: - ...

  2. java 笔记(5) —— 线程,yield,join

    一.线程各个状态与转换: 新建状态:用new语句创建的线程对象处于新建状态,此时它和其它的java对象一样,仅仅在堆中被分配了内存 .就绪状态:当一个线程创建了以后,其他的线程调用了它的start() ...

  3. C#中的线程三 (结合ProgressBar学习Control.BeginInvoke)

    C#中的线程三(结合ProgressBar学习Control.BeginInvoke) 本篇继上篇转载的关于Control.BeginInvoke的论述之后,再结合一个实例来说明Cotrol.Begi ...

  4. Java线程中yield与join方法的区别

    长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...

  5. 指定线程执行的顺序---join()

    线程T1,T2,T3分别启动,如何让其执行顺序变为T3>T2>T1: 线程1: package test6; public class Thread1 extends Thread{ pr ...

  6. spark三种连接Join

    本文主要介绍spark join相关操作. 讲述spark连接相关的三个方法join,left-outer-join,right-outer-join,在这之前,我们用hiveSQL先跑出了结果以方便 ...

  7. Java并发编程的艺术笔记(三)——Thread.join()

    t.join()方法只会使主线程进入等待池并等待t线程执行完毕后才会被唤醒.并不影响同一时刻处在运行状态的其他线程.它能够使得t.join()中的t优先执行,当t执行完后才会执行其他线程.能够使得线程 ...

  8. C# Thread.Join的报错情形——论执行完的线程能够成功执行Join吗

    结论: 能, 执行完的线程调用Join不会抛出错误. Thread.Join()是什么? Join()函数用于阻塞地等待线程结束, 其行为是在线程A中调用了线程B的Join()后, 线程A将一直阻塞在 ...

  9. java 多线程 Thread.join子线程结束父线程再运行;join(long):等待超时毫秒数

    Join的使用 目的:当子线程运行结束后,父线程才能再继续运行 /** * @ClassName ThreadJoinExample * @projectName: object1 * @author ...

  10. C#中的线程(三) 使用多线程

    第三部分:使用多线程 1.  单元模式和Windows Forms 单元模式线程是一个自动线程安全机制, 非常贴近于COM——Microsoft的遗留下的组件对象模型.尽管.NET最大地放弃摆脱了遗留 ...

随机推荐

  1. SlickUpload Upload to disk

    The file upload stream provider is a built-in SlickUpload provider that uses the filesystem for uplo ...

  2. SQL server 临时表

    创建临时表,#代表局部临时表,##代表全局临时表.局部临时表和全局临时表的具体含义是什么呢? 举例说明一下比较清晰些,先来看下局部临时表,[新建查询],在里面输入如下文本: 运行后,我们在此文件执行输 ...

  3. java基础,继承类题目:编写一个Java应用程序,该程序包括3个类:Monkey类、People类和主类 E

    21.编写一个Java应用程序,该程序包括3个类:Monkey类.People类和主类 E.要求: (1) Monkey类中有个构造方法:Monkey (String s),并且有个public vo ...

  4. TSql Top 用法

    第一部分:TSql Top 有两种用法 1,限制查询结果集返回的行数或总行数的百分比. 当将 TOP 与 ORDER BY 子句结合使用时,结果集限制为前 N 个已排序行:否则,以未定义的顺序返回前 ...

  5. 【WP 8.1开发】如何处理摄像头翻转的问题

    模拟器就像我们儿时的梦境,在其上运行应用程序时,一切总是那么美好的:而真机测试如同我们这个纷乱无章的现实世界,你会遇到各种小人和畜生,常常会遭受莫名的挫折.面对挫折,有人迎难而上,或不予理采,走自己的 ...

  6. CSS布局(下)

    1.CSS布局之浮动 1.1.float之图文混排 float的意思就是元素漂浮在上层. 可以直接通过设置float属性实现图文混排,代码如下: <div style="width:2 ...

  7. CSS3的学习--实现瀑布流

    基于CSS3实现瀑布流,使用CSS3的CSS 多栏(Multi-column). 可以到github上下载源码 : https://github.com/CraryPrimitiveMan/water ...

  8. Socket桥(转载)

    最好方案:使用haproxy 或者nginx转发.自己写程序性能和监控难保证,推荐使用开源软件替代. 源地址为:http://baishaobin2003.blog.163.com/blog/stat ...

  9. Android横竖屏切换及其对应布局加载问题

    第一,横竖屏切换连带横竖屏布局问题: 如果要让软件在横竖屏之间切换,由于横竖屏的高宽会发生转换,有可能会要求不同的布局. 可以通过以下两种方法来切换布局: 1)在res目录下建立layout-land ...

  10. 使用NuGet管理项目类库引用

    NuGet 是微软开发平台(包括.NET平台)的一个包管理器,这里只介绍和.NET相关的NuGet Visual Studio扩展客户端, 在VS2010 ,VS2012 ,VS2013中默认集成了N ...