继承 Thread 类

class MyThread1 extends Thread{
@Override
public void run(){
System.out.println("继承 Thread ...");
}
} public class Test1 extends Thread {
public static void main(String[] args) {
new MyThread1().start();
}
}

实现 Runnable 接口

class MyThread implements Runnable{

    @Override
public void run() {
System.out.println("继承 Runnable ......");
}
}
public class Test1 {
public static void main(String[] args) {
// 创建真实对象
MyThread myThread = new MyThread();
// 创建代理对象
Thread t = new Thread(myThread);
t.start();
}
}

实现 Callable 接口

class MyThread implements Callable<String> {

    @Override
public String call() throws Exception {
return "hello world!";
}
}
public class Test1 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 创建对象
MyThread myThread = new MyThread();
// 创建线程, 使用线程调度服务来创建, 参数表示创建线程的数量
ExecutorService t = Executors.newFixedThreadPool(1);
// 执行线程
Future<String> result = t.submit(myThread);
// 获取线程执行结果的返回值, 将会等待线程执行结束
String s = result.get();
System.out.println(s);
     // 停止线程
t.shutdownNow();
}
}

龟兔晒跑

class MyThread implements Callable<String> {
// 步数, 记录跑步的数量, 初始化为 0
private int step = 0;
// 停止线程的标识, 为 false 就跳出循环(线程体)
private boolean flag = true;
// 线程名称, 标识小兔子和乌龟
private String name; public boolean getFlag(){
return this.flag;
} public void setFlag(boolean flag) {
this.flag = flag;
} // 频率, 多少毫秒跑一步, 小兔子和老乌龟是不一样的
private long time; public MyThread(String name, long time) {
this.name = name;
this.time = time;
} @Override
public String call() throws Exception {
// 获取 flag , 如果是 true 就执行循环体
while (this.getFlag()) {
step++;
Thread.sleep(time);
}
return name + "跑了" + step + "步";
}
} public class Test1 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyThread rabbit = new MyThread("小兔子", 500);
MyThread tortoise = new MyThread("老乌龟", 1000);
// 创建线程, 通过线程调度服务来创建, 参数表示线程数量
ExecutorService threadService = Executors.newFixedThreadPool(2);
// 执行线程
Future<String> rabbitResult = threadService.submit(rabbit);
Future<String> tortoiseResult = threadService.submit(tortoise);
// 2 秒后小兔子和乌龟停止跑步, Callable 可以抛异常
Thread.sleep(2000);
rabbit.setFlag(false);
tortoise.setFlag(false);
// 获取结果
String s = rabbitResult.get();
String s2 = tortoiseResult.get();
// 打印结果
System.out.println(s);
System.out.println(s2);
// 停止服务
threadService.shutdownNow();
}
}

停止线程

  停止线程的方法被废弃了, 如果需要停止需要手动实现, 步骤如下:

    1, 线程类中定义一个成员变量

    2, 线程体中使用该变量

    3, 对外提供方法改变标识

class MyThread2 implements Runnable{

    // 定义一个变量, 用于控制停止线程
private boolean flag = true; public boolean getFlag() {
return flag;
}
// 对外提供修改值的方法
public void setFlag(boolean flag) {
this.flag = flag;
} @Override
public void run() {
// 循环获取变量 flag 值, 如果是 true 就执行
while (this.getFlag()){
System.out.println("根本停不下来...");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Test2 { public static void main(String[] args) throws InterruptedException {
MyThread2 myThread2 = new MyThread2();
new Thread(myThread2).start(); // 两秒后停止线程
Thread.sleep(200);
myThread2.setFlag(false);
} }

Java 创建线程/停止线程的更多相关文章

  1. java并发之停止线程

    停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作.停止一个线程可以用Thread.stop()方法,但最好不要用它.虽然它确实可以停止一个正在运行的线程,但是这个方法是不安 ...

  2. java多线程之停止线程

    /*1.让各个对象或类相互灵活交流2.两个线程都冻结了,就不能唤醒了,因为根据代码要一个线程活着才能执行唤醒操作,就像玩木游戏3.中断状态就是冻结状态4.当主线程退出的时候,里面的两个线程都处于冻结状 ...

  3. Java创建多线程和线程安全集合Vector

    public class Test { public static Vector<String> data = new Vector<String>(); public sta ...

  4. (Java多线程系列四)停止线程

    停止线程 停止线程的思路 ①使用退出标志,使线程正常退出,也就是当run()方法结束后线程终止. class Thread01 extends Thread { // volatile关键字解决线程的 ...

  5. 【Java 语言】Java 多线程 一 ( 线程启动 | 线程中断 )

    一. 线程启动 线程启动 : -- 1. 继承 Thread 运行线程 : 重写 Thread 类的 run 方法, 然后执行该线程; -- 2. 实现 Runnable 接口, 并运行线程; -- ...

  6. Thread之十:停止线程方法汇总

    在上篇文章<多线程的使用——Thread类和Runnable接口>中提到中断线程的问题.在JAVA中,曾经使用stop方法来停止线程,然而,该方法具有固有的不安全性,因而已经被抛弃(Dep ...

  7. 线程停止与volatile

    1.使用标志位停止线程 在Java中希望停止线程,可以使用设置标志位的方法,如下例所示: class SimpleTask implements Runnable{ private boolean s ...

  8. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  9. Java如何停止线程?

    在Java编程中,如何停止线程? 以下示例演示了如何通过创建一个用户定义的方法run()方法和Timer类来停止线程. package com.yiibai; import java.util.Tim ...

随机推荐

  1. ubuntu 16.04 python版本切换(python2和python3)

    sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100 sudo update-alternati ...

  2. Spring实战拆书--SpringBean

    代码源码地址:https://github.com/wujiachengSH/springBeanDemo 概述:本章将讲解Spring对于Bean的管理方案. 目录: 准备工作 自动装配 处理装配歧 ...

  3. oracle 锁表 and 解锁

    查询锁定表的相关 SELECT l.session_id sid, s.serial#, l.locked_mode,l.oracle_username, l.os_user_name,s.machi ...

  4. [Jenkins]Jenkins构建时提示java.io.IOException: No space left on device

    突然发现Jenkins的Job全部都停了,打开Jenkins发现所有的slave机器,均提示: 点开Dead(!),提示Thread has died,如下图: 看图好像说是Jenkins所在的服务器 ...

  5. 从面试连跪到收割offer,回顾我的春招面试历程(研发岗位)

    本文首发于自微信公众号[程序员江湖] 作者How 2 Play Life,985 软件硕士,阿里 Java 研发工程师,在技术校园招聘.自学编程.计算机考研等方面有丰富经验和独到见解,目前致力于分享程 ...

  6. mongo-spark-读取不同的库数据和写入不同的库中

    mongo-spark-读取不同的库数据和写入不同的库中 package com.example.app import com.mongodb.spark.config.{ReadConfig, Wr ...

  7. 升级glibc、gcc、zlib等

    前言:昨天公司先上线一个项目,需要用到Libreoffice开源办公套件,版本为最新版6.2的.这就难为我老人家,没办法,干吧. 成功的路上总是不那么一番风顺,总会有点小瑕疵,才会让人铭记于心. 先介 ...

  8. Mysql的跨表更新

    本文介绍mysql多表 update在实践中几种不同的写法. 假定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Price:另外一张表是ProductPrice表,我们要将Pro ...

  9. SpringMVC学习(四)———— 数据回显与自定义异常处理器

    一.数据回显技术 Springmvc默认支持对pojo类型的数据回显,默认不支持简单类型的数据回显 1.1.什么是数据回显? 在信息校验时,如果发生校验错误,那么把校验的数据信息,依然停留在当前页面, ...

  10. Java设计模式学习记录-状态模式

    前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使 ...