Java 创建线程/停止线程
继承 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 创建线程/停止线程的更多相关文章
- java并发之停止线程
停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作.停止一个线程可以用Thread.stop()方法,但最好不要用它.虽然它确实可以停止一个正在运行的线程,但是这个方法是不安 ...
- java多线程之停止线程
/*1.让各个对象或类相互灵活交流2.两个线程都冻结了,就不能唤醒了,因为根据代码要一个线程活着才能执行唤醒操作,就像玩木游戏3.中断状态就是冻结状态4.当主线程退出的时候,里面的两个线程都处于冻结状 ...
- Java创建多线程和线程安全集合Vector
public class Test { public static Vector<String> data = new Vector<String>(); public sta ...
- (Java多线程系列四)停止线程
停止线程 停止线程的思路 ①使用退出标志,使线程正常退出,也就是当run()方法结束后线程终止. class Thread01 extends Thread { // volatile关键字解决线程的 ...
- 【Java 语言】Java 多线程 一 ( 线程启动 | 线程中断 )
一. 线程启动 线程启动 : -- 1. 继承 Thread 运行线程 : 重写 Thread 类的 run 方法, 然后执行该线程; -- 2. 实现 Runnable 接口, 并运行线程; -- ...
- Thread之十:停止线程方法汇总
在上篇文章<多线程的使用——Thread类和Runnable接口>中提到中断线程的问题.在JAVA中,曾经使用stop方法来停止线程,然而,该方法具有固有的不安全性,因而已经被抛弃(Dep ...
- 线程停止与volatile
1.使用标志位停止线程 在Java中希望停止线程,可以使用设置标志位的方法,如下例所示: class SimpleTask implements Runnable{ private boolean s ...
- -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中
本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait( ...
- Java如何停止线程?
在Java编程中,如何停止线程? 以下示例演示了如何通过创建一个用户定义的方法run()方法和Timer类来停止线程. package com.yiibai; import java.util.Tim ...
随机推荐
- vue搭建多页面开发环境
自从习惯开发了单页面应用,对多页面的页面间的相互跳转间没有过渡效果.难维护极度反感.但是最近公司技术老大说,当一个应用越来越大的时候单页面模式应付不来,但是没讲怎么应付不来,所以还得自己去复习一遍这两 ...
- BeautifuSoup的使用
BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后遍可以使用他提供的方法进行快速查找指定元素,从而使得在HTML或XML中查找指定元素变得简单.
- Java核心技术及面试指南 面向对象部分的面试题总结以及答案
问题2.7.1,开放性问题,说一下你对面向对象思想的了解. 要点1,先说基础概念,比如面向对象思想包括封装.继承.多态,然后说些语法,比如可以通过extends继承类.通过implement来实现接口 ...
- Redis主从+KeepAlived实现高可用
Redis是我们当下比较流行使用的非关系数据库,可支持多样化的数据类型,多线程高并发支持,redis运行在内存拥有更快的读写.因为redis的表现如此出色,如何能保障redis在运行中能够应对宕机故障 ...
- for循环输出菱形的形状【java】
使用for循环语句输出以下“菱形”效果: * *** ***** ******* ********* ******* ***** *** * 代码 /* * *** ***** ******* *** ...
- Spring Boot 系列(七)Swagger2-生成RESTful接口文档
Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集成到服 ...
- HBase 在人工智能场景的使用
近几年来,人工智能逐渐火热起来,特别是和大数据一起结合使用.人工智能的主要场景又包括图像能力.语音能力.自然语言处理能力和用户画像能力等等.这些场景我们都需要处理海量的数据,处理完的数据一般都需要存储 ...
- 一文带你学会使用YOLO及Opencv完成图像及视频流目标检测(上)|附源码
计算机视觉领域中,目标检测一直是工业应用上比较热门且成熟的应用领域,比如人脸识别.行人检测等,国内的旷视科技.商汤科技等公司在该领域占据行业领先地位.相对于图像分类任务而言,目标检测会更加复杂一些,不 ...
- vue_drf之实现短信验证码
一.需求 1,需求 我们在做网站开发时,登录页面很多情况下是可以用手机号接收短信验证码,然后实现登录的,那我们今天就来做一做这一功能. 伪代码: 进入登录页面,点击短信登录 输入手机号码,点击获取验证 ...
- 我的python渗透测试工具之主机嗅探
嗅探工具的主要目标是基于UDP发现目标网络中的存活主机,选择UDP的原因是UDP访问过程开销小. 由于很多的操作系统在处理UDP端口的闭合时都会存在一个共性,我们也正是利用这个共性来开展确定此IP上是 ...