主密钥

/*

 * 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. 用wireshark解析应用层存储包

    工作中常常须要统计server上的rtp包接收.发送性能.不想自己再做一套统计软件,打算用现有的wireshark来做分析统计. 先把rtp头存成pcap格式文件,pcap文件格式及如何存储能够參照这 ...

  2. 编程之美2013 初赛一 A - 竞价 学习大牛的思路

    这题我做了N久也做不出....赛后看了大牛AC的思路.... Program: #include<iostream> #include<cmath> #include<s ...

  3. [Cocos2d-x]博客推荐

    推荐一下大神们的博客: JackyStudio: http://blog.csdn.net/jackyvincefu/article/category/1591201/3 老G的小屋: http:// ...

  4. Redis slowlog

    和mongo的slowlog一样,redis中对于操作时间较长(默认为10秒)的命令也会记录下来,不过它将它们保存在redisServer结构中的slowlog这个链表中,新进来的log排在链表头部, ...

  5. javascript面向对象程序设计

    在学习js面向对象编程之前,首先须要知道什么是面向对象.面向对象语言都有类的概念,通过它能够创建具有同样属性和方法的对象.但js并没有类的概念,因此js中的对象和其它语言的对象有所不同. js对象能够 ...

  6. 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 ...

  7. kafka web console安装

    貌似非常多小伙伴都不能成功打包,共享下之前打包的文件: http://pan.baidu.com/s/1sjkE37J ======== kafka自己竟然没有还一个Web管理界面.. 这里有个第三方 ...

  8. Java对象序列化/反序列化的注意事项

    Java对象序列化 对于一个存在Java虚拟机中的对象来说,其内部的状态只是保存在内存中.JVM退出之后,内存资源也就被释放,Java对象的内部状态也就丢失了.而在很多情况下,对象内部状态是需要被持久 ...

  9. 【微信公众平台开发】公布动态新闻好帮手UEditor富文本

    因为微信要做公布动态新闻.那就须要富文本. 上网搜索有非常多这样的插件,比方CKEditor.KindEditor等:最后看到百度一款开源的UEditor.官网打开,风格设计就吸引住了自己.所以就选U ...

  10. SWT中在treeview中显示图片

    package com.repositoryclient.treeview; import org.eclipse.jface.resource.ImageDescriptor; import org ...