主密钥

/*

 * wait 和 sleep 差别?

 * 1.wait能够指定时间也能够不指定

 * sleep必须指定时间

 * 2.在同步中,对CPU的运行权和锁的处理不同

 * wait释放运行权,释放锁    sleep释放运行权,不释放锁

 */

//同步里具备运行资格的线程不止一个,可是能得到锁的仅仅有一个,所以能运行的也仅仅有一个



一、停止线程的方式

不可能让线程一直在执行。所以须要让线程停止



1.定义循环结束标记

一般而言,线程执行代码都是循环的,仅仅要控制了循环就能够结束任务

2.使用interrupt(中断)

结束线程的冻结状态。使线程回到执行状态

PS:stop过时了,不用了

第一种方式:(经常使用)

class StopThread implements Runnable
{
private boolean flag = true;
public void run()
{
while(flag)
{
System.out.println(Thread.currentThread().getName()+"---");
}
}
public void ChangeFlag()
{
flag = false;
}
}
public class Main
{
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 i = 0;
while(true)
{
if(++i == 20)//i达到20后结束全部线程
{
s.ChangeFlag();
break;
}
System.out.println("Main.main"+i);
}
System.out.println("Final");
}
}

缺点:

class StopThread implements Runnable
{
private boolean flag = true;
public synchronized void run()
{
while(flag)
{
try {
wait();
} catch (InterruptedException e) {
// TODO: handle exception
System.out.println(Thread.currentThread().getName()+"..."+e);
}
System.out.println(Thread.currentThread().getName()+"-++--");
}
}
public void ChangeFlag()
{
flag = false;
}
}

主线程结束了。t0 t1直接wait()了。假设线程处于了冻结状态。就无法读取标记,所以就引入了另外一种结束线程的方式



另外一种方式:interrupt

将线程从冻结状态强制恢复到执行状态中。使线程回到具备CPU执行资格的状态。可是会发生中断异常(InterruptException)

class StopThread implements Runnable
{
private boolean flag = true;
public synchronized void run()
{
while(flag)
{
try {
wait();
} catch (InterruptedException e) {
// TODO: handle exception
System.out.println(Thread.currentThread().getName()+"........."+e);
flag = false;//注意处理,不加这个会导致线程继续等待。主线程结束t1 t2未结束
}
System.out.println(Thread.currentThread().getName()+"-++--");
}
}
public void ChangeFlag()
{
flag = false;
}
}
public class Main
{
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 i = 0;
while(true)
{
if(++i == 20)//i达到20后结束全部线程
{
//s.ChangeFlag();
t1.interrupt();
t2.interrupt();
break;
}
System.out.println("Main.main"+i);
}
System.out.println("Final");
}
}

二、守护线程

setDaemon(boolean)

public class Main
{
public static void main(String[] args)
{
StopThread s = new StopThread();
Thread t1 = new Thread(s);
Thread t2 = new Thread(s);
t1.start();
t2.setDaemon(true);//守护线程,能够理解为后天线程
//后天线程的特点:执行和前台线程一样,和CPU抢夺执行权
// 结束:前台线程必须手动结束,后台线程假设全部的前提线程都结束了,后台线程也跟着结束
t2.start();
int i = 0;
while(true)
{
if(++i == 20)//i达到20后结束全部线程
{
//s.ChangeFlag();
t1.interrupt();
//t2.interrupt();
break;
} System.out.println("Main.main"+i);
}
System.out.println("Final");
}
}

守护线程简单理解:比方说(英雄联盟)LOL。我方英雄须要守护我方的防御塔,塔没了,守护线程也就不是必需存在了

三、线程的其它方法

1.join()

2.setPriority()



class Demo implements Runnable
{
public void run()
{
for(int i = 0;i<20;i++)
System.out.println(Thread.currentThread().getName()+"..."+i);
}
} public class Main
{
public static void main(String[] args)throws Exception
{
Demo d = new Demo();
Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
t1.start();
t1.join();//t1线程要申请增加进来。执行。也就是t1不完,t2 和 主线程 就不能执行。
//暂时假如一个线程,就要用join方法
t2.start();//假设join放在t2.start()后面,那么主线程仅仅等待t1完毕后执行,而t1和t2互相争夺执行权
for(int i = 0;i<20;i++)
System.out.println(Thread.currentThread().getName()+".."+i);
}
}

优先级:setPriority

class Demo implements Runnable
{
public void run()
{
for(int i = 0;i<20;i++)
System.out.println(Thread.currentThread().toString()+"..."+i);
}
} public class Main
{ public static void main(String[] args)throws Exception
{
Demo d = new Demo(); Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
t1.start();
t2.start();
t2.setPriority(Thread.MAX_PRIORITY);
// Thread.MIN_PRIORITY优先级最小1
//Thread.MAX_PRIORITY 有效级最大10
//Thread.NORM_PRIORITY 默认优先级 5
for(int i = 0;i<20;i++)
System.out.println(Thread.currentThread()+".."+i);
}
}

3.线程组

把10个线程放一个组里。假设中断这一组线程。那么这10个线程都中断了

4.yield()暂停当前正在运行的线程,并运行其它线程



class Demo implements Runnable
{
public void run()
{
for(int i = 0;i<20;i++)
{
System.out.println(Thread.currentThread().toString()+"..."+i);
Thread.yield();
}
}
}
public class Main
{ public static void main(String[] args)throws Exception
{
new Thread()//线程子类
{
public void run()
{
for(int i = 0;i<20;i++)
{
System.out.println(Thread.currentThread().getName()+"x = "+i);
}
}
}.start(); for(int i = 0;i<20;i++)
{
System.out.println(Thread.currentThread().getName()+"y = "+i);
}
Runnable r = new Runnable()
{
public void run()
{
for(int i = 0;i<20;i++)
{
System.out.println(Thread.currentThread().getName()+"z = "+i);
}
}
};
new Thread(r).start();
}
}

多线程面试题:

1.

class Text implements Runnable
{
public void run(Thread t)
{ }
}
//是否编译失败?假设失败错误在哪?

失败,没有实现run方法的覆盖

改法一:

abstract class Text implements Runnable
{
public void run(Thread t)
{ }
}

改法二:重载,进行覆盖

class Text implements Runnable
{
public void run()
{
System.out.println("Text.run()1");
}
public void run(Thread t)
{
System.out.println("Text.run()2");
}
}

2.

public class Main
{ public static void main(String[] args)throws Exception
{ new Thread(new Runnable()
{
public void run() {
// TODO Auto-generated method stub
System.out.println("Runnable run");
}
})
{
public void run()
{
System.out.println("Thread run");
}
}.start();//这段代码编译能通过吗?假设能打印哪一句
}
}

打印Thread run

以子类为主,没有子类以父类为主







版权声明:本文博主原创文章,博客,未经同意不得转载。

JAVA学习课第二十八届(多线程(七))- 停止-threaded多-threaded面试题的更多相关文章

  1. JAVA学习课第五十八届 — GUI

    GUI Graghical User Interface(图形用户接口) java为GUI提供的对象都存在java.awt和java.swing包中 Java的GUI做的的确干只是C++等.不打算浪费 ...

  2. JAVA学习课第五十三届 — IO流程(七)File打靶 &amp; Properties设置

    一个.锻炼 深度遍历目录 深度遍历非常自然而然想到递归,而递归就非常自然的想到事实上现的底层算法是栈 对指定文件夹下列出全部内容(包括子文件夹的内容) PS:建议不要遍历C盘 import java. ...

  3. Java学习个人备忘录之多线程

    进程:正在进行中的程序(直译). 线程:就是进程中一个负责程序执行的控制单元(执行路径) 一个进程中可以有多个执行路径,称之为多线程. 一个进程中至少要有一个线程. 开启多个线程是为了同时运行多部分代 ...

  4. Java学习笔记4(多线程)

    多线程 多个程序块同时运行的现象被称作并发执行.多线程就是指一个应用程序中有多条并发执行的线索,每条线索都被称作一条线程,它们会交替执行,彼此间可以进行通信. 进程:在一个操作系统中,每个独立执行的程 ...

  5. Java学习笔记45(多线程二:安全问题以及解决原理)

    线程安全问题以及解决原理: 多个线程用一个共享数据时候出现安全问题 一个经典案例: 电影院卖票,共有100座位,最多卖100张票,买票方式有多种,网上购买.自主售票机.排队购买 三种方式操作同一个共享 ...

  6. java学习之浅谈多线程2--线程同步

    如果一个共享资源被多个线程同时访问,可能会遭到破坏.举个例子说明这个问题,假设创建并启动100个线程,每个线程都往同一个账户中添加一个便士,代码如下: import java.util.concurr ...

  7. Java 学习笔记 ------第二章 从JDK到IDE

    本章学习目标: 了解与设定PATH 了解与指定CLASSPATH 了解与指定SOURCEPATH 使用package与import管理类别 初步认识JDK与IDE的对应关系 一.第一个Java程序 工 ...

  8. 2017《Java学习》第二次作业 计科1502任秀兴

    学习git总结 安装git 1. 安装完成后执行命令git --version查看版本 2.执行命令git config --global user.nam "你的用户名",执行命 ...

  9. JAVA学习课第五 — IO流程(九)文件分割器合成器

    文件分割器 private static final int SIZE = 1024 *1024; public static void splitFile(File file) throws IOE ...

随机推荐

  1. HDU 1007 近期点对

    分治法求近期点对 递归将点不断分成小组.计算最短距离.此时的最短距离不过两点都属两块的某一块(这里的切割点是mid点). 还须要考虑两点分属两块的情况. 这时对于选点则把范围缩小到了以mid为中心. ...

  2. robots.txt禁止搜索引擎收录

    禁止搜索引擎收录的方法         一.什么是robots.txt文件? 搜索引擎通过一种程序robot(又称spider),自动访问互联网上的网页并获取网页信息. 您可以在您的网站中创建一个纯文 ...

  3. 浅谈spring——注解配置(九)

    spring定义一个切面是件麻烦的事情,需要实现专门的接口,还要进行一些较为复杂的配置,有没有较为简单的方法??? @AspectJ注解可以很容易定义一个切面,且不需要实现任何的接口.缺点是对JDK的 ...

  4. hadoop每个家庭成员

    本文没有提到的原则.谈论hadoop项目周边,它的作用. hadoop这个词已经流行了很多年.大数据的记载会认为hadoop,然后hadoop的作用是什么呢? 官方定义:hadoop是一个开发和执行处 ...

  5. MD5 概念与用途

    MD5概念: MD5这是message-digest algorithm 5(信息-摘要算法)缩写.用于加密和解密技术上,它能够说是文件的"数字指纹".不论什么一个文件,不管是可运 ...

  6. hdu4487(概率dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4487 题意:开始位置在0,每一步可以向右向左或者不动,问走了n步后,路径中能到达最右的期望. 分析:d ...

  7. URAL1113(数学)

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1113 根据样例分析: 1.沙漠只有500公里或者更短,这时很简单,一次搞定. 2.沙漠6 ...

  8. hadoop在实现kmeans算法——一个mapreduce实施

    写mapreduce程序实现kmeans算法.我们的想法可能是 1. 次迭代后的质心 2. map里.计算每一个质心与样本之间的距离,得到与样本距离最短的质心,以这个质心作为key,样本作为value ...

  9. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第15章节--开发SP2013工作流应用程序 总结

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第15章节--开发SP2013工作流应用程序 总结         在SP2013中,工作流已经从SP Server中脱离 ...

  10. ecshop 浏览历史样式的修改

    ecshop的浏览历史的样式,例如我修改的是只让浏览历史显示浏览历史的商品名称 而不显示浏览历史的商品的价格和图片 首先找到要修改 的文件includes\lib_insert.php 找到函数fun ...