IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 线程概念及实现方式 -> 正文阅读

[Java知识库]线程概念及实现方式

一、线程概念

1.多任务

多任务是指用户可以在同一时间内运行多个应用程序,每一个应用程序被称作一个任务。

2.多线程

多线程是指计算机可以在同一时间执行多于一个线程,从而提高性能。

3.线程

线程是操作系统能够进行运行运算调度的最小单位,一条线程指的是进程中一个单一顺序的控制流。例如main函数就是一个线程。

4.进程

进程是执行程序的一次执行过程,是由系统分配的资源单位。一个进程里面可以包含多个线程。

二、实现线程的三种方式

简述

Thread类是java.lang.Object类下的,实现线程有三种方法,继承Thread类,实现Runnable接口,实现callable接口。

1.继承Thread类

继承Thread类并重写run()方法,调用start()方法

/**
 * 继承Thread类实现线程
 */
public class ThreadDemo1 extends Thread{
 ? ?//重写run()方法
 ? ?@Override
 ? ?public void run() {
 ? ? ? ?for (int i = 1; i <= 100; i++) {
 ? ? ? ? ? ?System.out.println("继承Thread类测试,下标:"+ i);
 ? ? ?  }
 ?  }
?
 ? ?public static void main(String[] args) {
 ? ? ? ?//执行start()方法
 ? ? ? ?new ThreadDemo1().start();
 ? ? ? ?
 ? ? ? ?for (int i = 0; i < 2000; i++) {
 ? ? ? ? ? ?System.out.println("main方法测试,下标:"+ i);
 ? ? ?  }
?
 ?  }
}

注意:当调用run()方法时,程序会执行,但是是按照程序顺序执行的,但是调用start()方法时程序是同时执行的。

2.实现Runnable接口

实现Runnable接口并重写run()方法,调用start()方法

/**
* 实现Runnable接口
*/
public class ThreadDemo2 implements Runnable {
 ? ?//重写run()方法
 ? ?@Override
 ? ?public void run() {
 ? ? ? ?for (int i = 1; i <= 100; i++) {
 ? ? ? ? ? ?System.out.println("实现Runnable接口测试,下标:"+ i);
 ? ? ?  }
 ?  }
?
 ? ?public static void main(String[] args) {
?
 ? ? ? ?//调用start()方法
 ? ? ? ?ThreadDemo2 threadDemo2 = new ThreadDemo2();
 ? ? ? ?new Thread(threadDemo2).start();
?
 ? ? ? ?for (int i = 0; i < 2000; i++) {
 ? ? ? ? ? ?System.out.println("main方法测试,下标:"+ i);
 ? ? ?  }
 ? ? ? ?
 ?  }
}

3.实现Callabel接口

实现Callable接口,重写call()方法,通过创建服务,提交任务,获取结果,关闭服务。

这种方式较前两种方式新增了返回值类型定义及可以抛出异常。

/**
 * 实现Callable接口
 */
public class ThreadDemo3 implements Callable<String> {
 ? ?@Override
 ? ?public String call() throws Exception {
 ? ? ? ?String str = "实现Callable接口";
 ? ? ? ?return str;
 ?  }
?
 ? ?public static void main(String[] args) throws ExecutionException, InterruptedException {
?
 ? ? ? ?ThreadDemo3 th1= new ThreadDemo3();
 ? ? ? ?ThreadDemo3 th2= new ThreadDemo3();
 ? ? ? ?//创建执行服务
 ? ? ? ?ExecutorService executorService = Executors.newFixedThreadPool(2);
?
 ? ? ? ?//提交任务
 ? ? ? ?Future<String> submit1 = executorService.submit(th1);
 ? ? ? ?Future<String> submit2 = executorService.submit(th2);
?
 ? ? ? ?//获取结果
 ? ? ? ?String s1 = submit1.get();
 ? ? ? ?String s2 = submit2.get();
 ? ? ? ?System.out.println(s1);
 ? ? ? ?System.out.println(s2);
?
 ? ? ? ?//关闭服务
 ? ? ? ?executorService.shutdown();
 ?  }
}

三、综合案例

龟兔赛跑线程实现代码

public class RabbitAndTurtleRace implements Runnable{
 ? ?//设置胜利者
 ? ?private static String winner;
 ? ?@Override
 ? ?public void run() {
?
 ? ? ? ?for (int i = 1; i <= 100; i++) {
?
 ? ? ? ? ? ?//模拟兔子睡觉
 ? ? ? ? ? ?if(Thread.currentThread().getName().equals("兔子") && i%10 == 0){
 ? ? ? ? ? ? ? ?try {
 ? ? ? ? ? ? ? ? ? ?Thread.sleep(200);
 ? ? ? ? ? ? ?  } catch (InterruptedException e) {
 ? ? ? ? ? ? ? ? ? ?e.printStackTrace();
 ? ? ? ? ? ? ?  }
 ? ? ? ? ?  }
 ? ? ? ? ? ?
 ? ? ? ? ? ?//判断游戏是否结束
 ? ? ? ? ? ?Boolean flag = gaveOver(i);
 ? ? ? ? ? ?if(!flag){
 ? ? ? ? ? ? ? ?System.out.println(Thread.currentThread().getName()+"--->跑了" + i + "步");
 ? ? ? ? ?  }
 ? ? ?  }
 ?  }
?
 ? ?public static void main(String[] args) {
 ? ? ? ?//设置两个线程
 ? ? ? ?RabbitAndTurtleRace race= new RabbitAndTurtleRace();
 ? ? ? ?new Thread(race,"兔子").start();
 ? ? ? ?new Thread(race,"乌龟").start();
?
 ?  }
 ? ?/**
 ? ? * 判断游戏是否结束
 ? ? */
 ? ?public Boolean gaveOver(int step){
 ? ? ? ?/**
 ? ? ? ? * 判断是否存在胜利者
 ? ? ? ? */
 ? ? ? ?if(winner != null){
 ? ? ? ? ? ?return true;
 ? ? ?  }
 ? ? ? ?if(step == 100){
 ? ? ? ? ? ?winner = Thread.currentThread().getName();
 ? ? ? ? ? ?System.out.println("winner is" + winner);
 ? ? ? ? ? ?return true;
 ? ? ?  }
 ? ? ? ?return false;
 ?  }
}
?
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-12 16:20:27  更:2022-05-12 16:21:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:09:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码