JAVA学习课第二十八届(多线程(七))- 停止-threaded多-threaded面试题
主密钥
/*
* 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面试题的更多相关文章
- JAVA学习课第五十八届 — GUI
GUI Graghical User Interface(图形用户接口) java为GUI提供的对象都存在java.awt和java.swing包中 Java的GUI做的的确干只是C++等.不打算浪费 ...
- JAVA学习课第五十三届 — IO流程(七)File打靶 & Properties设置
一个.锻炼 深度遍历目录 深度遍历非常自然而然想到递归,而递归就非常自然的想到事实上现的底层算法是栈 对指定文件夹下列出全部内容(包括子文件夹的内容) PS:建议不要遍历C盘 import java. ...
- Java学习个人备忘录之多线程
进程:正在进行中的程序(直译). 线程:就是进程中一个负责程序执行的控制单元(执行路径) 一个进程中可以有多个执行路径,称之为多线程. 一个进程中至少要有一个线程. 开启多个线程是为了同时运行多部分代 ...
- Java学习笔记4(多线程)
多线程 多个程序块同时运行的现象被称作并发执行.多线程就是指一个应用程序中有多条并发执行的线索,每条线索都被称作一条线程,它们会交替执行,彼此间可以进行通信. 进程:在一个操作系统中,每个独立执行的程 ...
- Java学习笔记45(多线程二:安全问题以及解决原理)
线程安全问题以及解决原理: 多个线程用一个共享数据时候出现安全问题 一个经典案例: 电影院卖票,共有100座位,最多卖100张票,买票方式有多种,网上购买.自主售票机.排队购买 三种方式操作同一个共享 ...
- java学习之浅谈多线程2--线程同步
如果一个共享资源被多个线程同时访问,可能会遭到破坏.举个例子说明这个问题,假设创建并启动100个线程,每个线程都往同一个账户中添加一个便士,代码如下: import java.util.concurr ...
- Java 学习笔记 ------第二章 从JDK到IDE
本章学习目标: 了解与设定PATH 了解与指定CLASSPATH 了解与指定SOURCEPATH 使用package与import管理类别 初步认识JDK与IDE的对应关系 一.第一个Java程序 工 ...
- 2017《Java学习》第二次作业 计科1502任秀兴
学习git总结 安装git 1. 安装完成后执行命令git --version查看版本 2.执行命令git config --global user.nam "你的用户名",执行命 ...
- JAVA学习课第五 — IO流程(九)文件分割器合成器
文件分割器 private static final int SIZE = 1024 *1024; public static void splitFile(File file) throws IOE ...
随机推荐
- 用wireshark解析应用层存储包
工作中常常须要统计server上的rtp包接收.发送性能.不想自己再做一套统计软件,打算用现有的wireshark来做分析统计. 先把rtp头存成pcap格式文件,pcap文件格式及如何存储能够參照这 ...
- 编程之美2013 初赛一 A - 竞价 学习大牛的思路
这题我做了N久也做不出....赛后看了大牛AC的思路.... Program: #include<iostream> #include<cmath> #include<s ...
- [Cocos2d-x]博客推荐
推荐一下大神们的博客: JackyStudio: http://blog.csdn.net/jackyvincefu/article/category/1591201/3 老G的小屋: http:// ...
- Redis slowlog
和mongo的slowlog一样,redis中对于操作时间较长(默认为10秒)的命令也会记录下来,不过它将它们保存在redisServer结构中的slowlog这个链表中,新进来的log排在链表头部, ...
- javascript面向对象程序设计
在学习js面向对象编程之前,首先须要知道什么是面向对象.面向对象语言都有类的概念,通过它能够创建具有同样属性和方法的对象.但js并没有类的概念,因此js中的对象和其它语言的对象有所不同. js对象能够 ...
- Extjs 3.4 和 web SSH(Ajaxterm)-howge-ChinaUnix博客
Extjs 3.4 和 web SSH(Ajaxterm)-howge-ChinaUnix博客 Extjs 3.4 和 web SSH(Ajaxterm) 2013-04-07 15:20:17 ...
- kafka web console安装
貌似非常多小伙伴都不能成功打包,共享下之前打包的文件: http://pan.baidu.com/s/1sjkE37J ======== kafka自己竟然没有还一个Web管理界面.. 这里有个第三方 ...
- Java对象序列化/反序列化的注意事项
Java对象序列化 对于一个存在Java虚拟机中的对象来说,其内部的状态只是保存在内存中.JVM退出之后,内存资源也就被释放,Java对象的内部状态也就丢失了.而在很多情况下,对象内部状态是需要被持久 ...
- 【微信公众平台开发】公布动态新闻好帮手UEditor富文本
因为微信要做公布动态新闻.那就须要富文本. 上网搜索有非常多这样的插件,比方CKEditor.KindEditor等:最后看到百度一款开源的UEditor.官网打开,风格设计就吸引住了自己.所以就选U ...
- SWT中在treeview中显示图片
package com.repositoryclient.treeview; import org.eclipse.jface.resource.ImageDescriptor; import org ...