线程休眠(让线程休息一会再运行)
  public static void sleep(long millis)

在自定义线程类中添加该方法。

更改后,运行测试类,结果就是每执行完一轮,就休息1秒(这里设置的是休眠1秒),再进行一轮。

一轮:(如果测试类调用了3个线程,那么就是随机运行3次为一轮)

如:

  哈士奇:1,日期:Wed Oct 05 21:01:19 CST 2016
  短尾猫:1,日期:Wed Oct 05 21:01:19 CST 2016
  萨摩耶:1,日期:Wed Oct 05 21:01:19 CST 2016

休息1秒,继续:

  萨摩耶:2,日期:Wed Oct 05 21:01:20 CST 2016
  哈士奇:2,日期:Wed Oct 05 21:01:20 CST 2016
  短尾猫:2,日期:Wed Oct 05 21:01:20 CST 2016

 public class ThreadSleep extends Thread {
@Override
public void run() {
for (int x = 0; x < 100; x++) {
System.out.println(getName() + ":" + x + ",日期:" + new Date());
// 睡眠
// 稍微休息1秒钟
try {
Thread.sleep(1000);//由于父类没有抛出异常,所以得try{}catch(){}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

线程加入
  public final void join():等待该线程终止。 这个方法是在测试类上添加的

也就是说,得等这个线程运行结束,别的线程才能运行

以下代码就是,哈士奇先数完0-99,萨摩耶和短尾猫才能运行。。。二哈真6

public class ThreadJoinDemo {
public static void main(String[] args) {
ThreadJoin tj1 = new ThreadJoin();
ThreadJoin tj2 = new ThreadJoin();
ThreadJoin tj3 = new ThreadJoin(); tj1.setName("哈士奇");
tj2.setName("萨摩耶");
tj3.setName("短尾猫"); tj1.start();
try {
tj1.join();//由于父类没有抛异常,所以得try{}catch(){}
} catch (InterruptedException e) {
e.printStackTrace();
} tj2.start();
tj3.start();
}
}

线程礼让
  public static void yield(); :暂停当前正在执行的线程对象,并执行其他线程。

让多个线程的执行更和谐,但是不能靠它保证全部的和谐(即是哈士奇运行一次,萨摩耶运行一次,短尾猫运行一次)。

这个方法不能完全保证,有可能哈士奇连续运行几次。二哈继续6。。

该方法在测试类中添加:

 public class ThreadYield extends Thread {
@Override
public void run() {
for (int x = 0; x < 100; x++) {
System.out.println(getName() + ":" + x);
Thread.yield();
}
}
}

守护线程
  public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。

通俗易懂地说:守护线程是用来保护别的非守护线程的,如果其它非守护线程都停止了,守护线程自身也必须停止

(保护的人挂了,守护者也得挂,不过守护者得到消息再挂,所以受保护者挂了以后,守护者会继续执行几次再挂)

代码:

 //这个代码中,刘备一运行完毕,张飞关羽跟着再运行几次,就停止
public class ThreadDaemonDemo {
public static void main(String[] args) {
ThreadDaemon td1 = new ThreadDaemon();
ThreadDaemon td2 = new ThreadDaemon(); td1.setName("关羽");
td2.setName("张飞"); // 设置守护线程
td1.setDaemon(true);
td2.setDaemon(true); td1.start();
td2.start(); Thread.currentThread().setName("刘备");
for (int x = 0; x < 5; x++) {
System.out.println(Thread.currentThread().getName() + ":" + x);
}
}
}

再来个配图:坦克大战

中断线程

public final void stop():让线程停止,过时了,但是还可以使用。

替代stop的:

public void interrupt():中断线程。 把线程的状态终止,并抛出一个InterruptedException。

自定义多线程类:

public class ThreadStop extends Thread {
@Override
public void run() {
System.out.println("开始执行:" + new Date()); // 休眠10秒钟
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// e.printStackTrace();
System.out.println("线程被终止了");
} System.out.println("结束执行:" + new Date());
}
}

测试类:

 public class ThreadStopDemo {
public static void main(String[] args) {
ThreadStop ts = new ThreadStop();
try {
Thread.sleep(3000);
// ts.stop(); //过了3秒后,关闭ThreadStop线程,
ts.interrupt(); //中断线程。 把线程的状态终止,并抛出一个InterruptedException
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public void interrupt():的执行结果:

    开始执行:Wed Oct 05 21:58:44 CST 2016
    线程被终止了
    结束执行:Wed Oct 05 21:58:47 CST 2016

java 22 - 7 多线程之控制线程的方法的更多相关文章

  1. java 22 - 12 多线程之解决线程安全问题的实现方式1

    从上一章知道了多线程存在着线程安全问题,那么,如何解决线程安全问题呢? 导致出现问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 上一章的程序,上面那3条都具备, ...

  2. java 22 - 13 多线程之解决线程安全问题的实现方式2

    上一章说了,解决线程安全问题的实现方式1是使用同步代码块 同时也知道了,同步代码块的锁对象是任意对象:(Object obj ;  Demo d;)这些都行 那么,现在来说解决线程安全问题的实现方式2 ...

  3. [转载]C# 多线程、控制线程数提高循环输出效率

    C#多线程及控制线程数量,对for循环输出效率. 虽然输出不规律,但是效率明显提高. 思路: 如果要删除1000条数据,只使用for循环,则一个接着一个输出.所以,把1000条数据分成seed段,每段 ...

  4. C# 多线程、控制线程数提高循环输出效率

    C#多线程及控制线程数量,对for循环输出效率. 虽然输出不规律,但是效率明显提高. 思路: 如果要删除1000条数据,只使用for循环,则一个接着一个输出.所以,把1000条数据分成seed段,每段 ...

  5. 【Java 线程的深入研究1】Java 提供了三种创建线程的方法

    Java 提供了三种创建线程的方法: 通过实现 Runnable 接口: 通过继承 Thread 类本身: 通过 Callable 和 Future 创建线程. 1.通过实现 Runnable 接口来 ...

  6. java 22 - 5 多线程之获取和设置线程对象的名称

    如何获取线程对象的名称呢? public final String getName():获取线程的名称.如何设置线程对象的名称呢? public final void setName(String n ...

  7. Java基础教程——多线程:创建线程

    多线程 进程 每一个应用程序在运行时,都会产生至少一个进程(process). 进程是操作系统进行"资源分配和调度"的独立单位. Windows系统的"任务管理器&quo ...

  8. 程序员:java中直接或间接创建线程的方法总结

    在java开发中,经常会涉及多线程的编码,那么通过直接或间接创建线程的方法有哪些?现整理如下: 1.继承Thread类,重写run()方法 class Worker extends Thread { ...

  9. java 22 - 20 多线程之线程池

    程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互. 而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池. 线程池里的每一个线程代码结束后 ...

随机推荐

  1. AE选中要素

    private void 选中要素ToolStripMenuItem_Click(object sender, EventArgs e) { if(axMapControl2.LayerCount&l ...

  2. 一次失败的APP业务渗透测试

    作者:whoamiecho 来源:ichunqiu 本文参加i春秋社区原创文章奖励计划,未经许可禁止转载! 一.  过程 1.1.事情起因:暴力破解 测试给了个普通用户账号,可以登录.APP一来就要登 ...

  3. 关于SharPoint2013一点细节的深究

    在进行SharePoint2013的开发过程中我发现在开启了某些功能,或者说是创建了个人站点之后有很多地方变了比如下面这个地方:     当然相应的URL地址也发生改变.也许很明确的我就打开了Welc ...

  4. 关于Android 的内存泄露及分析

    一. Android的内存机制Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似.程序员通过new为对象分配内存,所有对象在java堆内分配空间:然而对象的释 ...

  5. Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信

    以下内容为原创,转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3360938.html 如新浪微博下面的标签切换功能,我以前也写过一篇博文(http:/ ...

  6. jQuery倒计时

    Css------------------------------------------------------------------------------------------------- ...

  7. UITableView传值(自己使用)(属性,代理传值)

    今天有些匆忙. 效果图如下: 代码如下: #import <UIKit/UIKit.h> #import "FirstViewController.h" @interf ...

  8. 编译生成IOS开发使用的FFmpeg的过程

    前言:本篇随笔纯属是参照<iOS 使用 FFmpeg>的过程,本人自己操作了一遍,但是本人记性不好,觉得这样的过程可以记录在博客中,以后需要可以快速回头翻阅细节.所以特地参考<iOS ...

  9. Windows7下安装CentOS

    以CentOS为平台,配以其他软件共同组成工作平台! 第一部分:安装前准备        1. 准备两个fat32格式的分区,一个用于存放centos光盘镜像及相关安装程序,一个用于安装centos( ...

  10. Spring的IOC逐层深入——依赖注入的两种实现类型

    构造器注入 构造器注入,即通过构造函数完成依赖关系的设定.我们看一下spring的配置文件: <?xml version="1.0" encoding="UTF-8 ...