多任务(Multitasking)
操作系统将CPU时间动态地划分给每个进程,操作系统同时执行多个进程,每
个进程独立运行。以进程的观点来看,它会以为自己独占Cpu的使用权。

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务进程是动态的概念,当程序在执行时,系统分配进程;多线程是在同一进程下,充分利用资源 ,多条执行路径,共享资源 (cpu data code)

===============================================
多线程 :
线程 : 程序中执行的顺序流
多线程 : 多任务执行,多路径执行
多任务之间可以实现同时执行

 优点 : 提高效率,提高性能缺点 :设计更复杂,可能会造成数据不安全
了解 : 三高网站 : 高可能  高性能  高并发进程与线程的区别 :进程 : 资源分配的最小单位,每个进程都具有自己的代码与数据空间(进程上下文),进程之间的切换资源消耗大线程 : cpu调度与执行的最小单位,一个进程至少包含1~n个线程,同一个进程的多个线程共享这个进程的代码数据空间,每个线程都有自己的运行栈与程序计数器,线程的切换消耗小

多线程的学习内容 :
线程的创建 *****
线程的状态
线程的安全 *****
线程通信

===============================================

线程创建方式 1:thread

    1.继承Thread类,重写run() + start()开启线程2.实现Runnable接口,重写run() + start()开启线程  --> *****优点 :接口多实现,类只能单继承实现资源共享3.实现juc包下Callable接口,重写call() + 线程池  --> 了解
public class Class002_Thread extends Thread {/*定义线程体*/@Overridepublic void run() {for(int i =1;i<=20;i++){System.out.println("一边喝水");try {Thread.sleep(1);  //让出cpu资源} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {//主线程//创建线程Class002_Thread th = new Class002_Thread();//开启线程th.start();  //告诉cpu,我们线程可以被调度for(int i =1;i<=20;i++){System.out.println("一边吃饭...");try {Thread.sleep(1);  //让出cpu资源} catch (InterruptedException e) {e.printStackTrace();}}}
}

线程创建方式 :2.实现Runnable接口

        优点 :接口多实现,类只能单继承实现资源共享

=============

public class Class003_Thread implements Runnable{public static void main(String[] args) {Class003_Thread ct = new Class003_Thread();//创建线程对象Thread th = new Thread(ct);//HR代理角色     Manager真实角色//静态代理实现 : 代理角色与真实角色实现相同的接口     代理角色持有真实角色的引用      代理行为//new Hr(manager).addUser();//开启线程th.start();//new Thread(new Class003_Thread()).start();for(int i=1;i<=20;i++){System.out.println("一边打游戏...");try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}}/*定义线程体*/@Overridepublic void run() {for(int i=1;i<=20;i++){System.out.println("一边陪女朋友...");try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}}
}
/*方法重写时候的要求 :== 方法签名<= 返回值类型>= 权限修饰符异常 <=  重写方法上抛出的编译时异常类型<=被重写方法上抛出的异常的类型*/
class Fu{void test(){}
}class Zi extends Fu{void test() throws NullPointerException{try {throw new FileNotFoundException();} catch (FileNotFoundException e) {e.printStackTrace();}}
}

例子

package com.yjxxt.thread01;
/*模拟银行柜台叫号系统 :服务柜台 : 2个   --> 2个线程业务序号 : 100号  --> 1~100号业务逻辑 : 通过2个柜台服务1~100号之间的每一个客户共享数据 : 1~100号注意 : 多个线程同时操作同一份资源,有可能会遇到数据不安全情况*/
public class Class004_Practice implements Runnable{private int num = 1;  //业务序号 1~100/*每个柜台的服务业务*/@Overridepublic void run() {while(true){//线程停止的条件if(num>100){break;}System.out.println(num++ +"号用户请到"+Thread.currentThread().getName()+"办理业务....");try {Thread.sleep(2);  //模拟办理业务所需时长} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {//1.一个系统,100号Class004_Practice cp = new Class004_Practice();//2.2个柜台Thread th1 = new Thread(cp,"一号柜台");Thread th2 = new Thread(cp,"二号柜台");//3.开启线程th1.start();th2.start();}
}

=====================

开启线程第三种方式 : (了解)实现juc包下的Callable接口

优点 :
1.抛出异常
2.定义返回值

public class Class005_Race implements Callable<Integer> {//记录赢的人的名字private String winner = null;  //控制游戏结束,线程的结束/*返回值: 参赛者的总步数*/@Overridepublic Integer call() {for(int i=1;i<=100;i++){System.out.println(Thread.currentThread().getName()+"正在跑第"+i+"步....");try {Thread.sleep(2);  //模拟跑步所耗时长} catch (InterruptedException e) {e.printStackTrace();}if("pool-1-thread-1".equals(Thread.currentThread().getName()) && i%10==0){try {Thread.sleep(10); //如果是兔子,修改10ms} catch (InterruptedException e) {e.printStackTrace();}}//判断是否还要继续if(!checkOver(i)){return i;}}return null;}//判断是否进行下一次步//返回值: false比赛结束  true比赛继续public boolean checkOver(int step){if(winner!=null){return false;}if(step==100){winner = Thread.currentThread().getName();return false;}return true;}public static void main(String[] args) throws ExecutionException, InterruptedException {//一场比赛Class005_Race race = new Class005_Race();//两个参赛者//1)创建一个固定大小2个线程的线程池--> 得到一个线程池提供的执行服务ExecutorService server = Executors.newFixedThreadPool(2);//2)提交任务  submit(Callable<T> task)Future<Integer> result1 = server.submit(race);Future<Integer> result2 =server.submit(race);//3)得到结果 V get()Integer num1 = result1.get();Integer num2 = result2.get();System.out.println(num1);System.out.println(num2);//4)关闭服务server.shutdown();}
}

通过内部类定义线程体

package com.yjxxt.thread01;
/*通过内部类定义线程体 :*/
public class Class006_Thread {//静态内部类static class Inner1 implements Runnable{@Overridepublic void run() {for(int i=1;i<=20;i++){System.out.println("一边玩手机...");try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}}}public static void main(String[] args) {//局部内部类class Inner2 implements Runnable{@Overridepublic void run() {for(int i=1;i<=20;i++){System.out.println("一边吃饭...");try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}}}new Thread(new Inner1()).start();new Thread(new Inner2()).start();//匿名内部类new Thread(new Runnable() {@Overridepublic void run() {for(int i=1;i<=20;i++){System.out.println("一边聊天...");try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}}}).start();//lambdanew Thread(()->{for(int i=1;i<=20;i++){System.out.println("一边看电视...");try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}}).start();}
}

线程定义, 实现方式及代码实现.相关推荐

  1. [Java 并发编程实战] 设计线程安全的类的三个方式(含代码)

    发奋忘食,乐以忘优,不知老之将至.---<论语> 前面几篇已经介绍了关于线程安全和同步的相关知识,那么有了这些概念,我们就可以开始着手设计线程安全的类.本文将介绍构建线程安全类的几个方法, ...

  2. 需求:定义老师和学生类,然后写代码测试;最后找到老师类和学生类当中的共性内容,抽出一个父类,用继承的方式改写代码,并进行测试

    需求:定义老师和学生类,然后写代码测试;最后找到老师类和学生类当中的共性内容,抽出一个父类 ,用继承的方式改写代码,并进行测试 思路: 1. 定义老师类(姓名,年龄,教书()) 2. 定义学生类(姓名 ...

  3. java future 线程 状态_手把手带你了解Java线程的实现方式及生命周期原理

    前言 我们在工作中线程技术很多情况下都能用的到,而且我们在面试的时候,线程技术基本上也是必问的.今天我来从线程的实现方式以及线程的生命周期做一个全面的讲解与分析,帮助大家能更好的去了解线程技术. 概念 ...

  4. java thread 线程销毁_手把手带你了解Java线程的实现方式及生命周期原理

    前言 我们在工作中线程技术很多情况下都能用的到,而且我们在面试的时候,线程技术基本上也是必问的.今天我来从线程的实现方式以及线程的生命周期做一个全面的讲解与分析,帮助大家能更好的去了解线程技术. 概念 ...

  5. JDK中的Timer和TimerTask详解 目录结构: Timer和TimerTask 一个Timer调度的例子 如何终止Timer线程 关于cancle方式终止线程 反复执行一个任务 sche

    JDK中的Timer和TimerTask详解 目录结构: Timer和TimerTask 一个Timer调度的例子 如何终止Timer线程 关于cancle方式终止线程 反复执行一个任务 schedu ...

  6. 黑马程序员--线程之间的通信,等待与唤醒机制,线程的终止方式,线程中的其他方法,优先级,toString() 守护线程,GUI图形化界面

    ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...

  7. JUC P1 进程,线程,管程 基础+代码

    文章目录 JUC P1 进程,线程,管程 基础+代码 0. 简单概念 0.1 进程和线程 0.2 并行和并发 0.3 同步和异步 1. 创建线程的方法 2. 查看进程和线程的方法 3. 线程运行 3. ...

  8. C++多线程:thread类创建线程的多种方式

    文章目录 描述 函数成员简介 总结 描述 头文件 <thread> 声明方式:std::thread <obj> 简介 线程在构造关联的线程对象时立即开始执行,从提供给作为构造 ...

  9. java 中启动线程的正确方式

    启动线程的正确方式是运行Thread类中的start()方法,使用run()方法只不过是运行了一个普通方法而已. 线程对象在初始化之后,由当前线程(主线程)执行的start()方法,然后去告诉jvm虚 ...

最新文章

  1. jboss5 启动时报HsqlException:length must be specified in type definition:VARBINARY错误
  2. 用偷梁换柱法清除腾讯QQ迷你首页的方法
  3. 北航计算机考研 跨考,过来人分享:给外校跨考北航同学的建议
  4. 丰农控股 CIO 王轶枭:万亿级农资市场,神策数据助力大丰收筑就数据驱动核心竞争力
  5. 【c++】为什么类中静态(static)成员不能在类的定义内初始化?
  6. Java虚拟机简单介绍
  7. linux 连接两个异构网,如何在Linux(或异构)网络上共享计算机?
  8. 本地java【动态监听】zk集群节点变化
  9. Concurrent HTTP connections in Node.js
  10. 【优先队列】HDU 1873——看病找医生
  11. win10中通过docker安装sqlserver服务器的操作说明
  12. 编程基本功:以输入法为例,谈谈测试案例的设计
  13. python车辆型号识别_汽车型号和款式的识别 如何通过车架号来识别车的型号款式?查汽车型号...
  14. 【python使用】使用python读取mid/mif文件,高精地图解析
  15. CLOCs: Camera-LiDAR Object Candidates Fusion for 3D Object Detection(论文阅读笔记)
  16. 中国金融市场目前存在的金融牌照总结
  17. win2008r2 64位解决Infragistics.NetAdvantage 安装时总是提示%SystemDriver%inetpub\wwwroot错误的方法
  18. 微信PC端C++技术获取聊天内容,这个技术足以进入腾讯上班!
  19. labview 网络通讯 TCP
  20. 腾讯太极文生图大模型,带你一起感受祖国大好河山

热门文章

  1. Racket编程指南——20 并行
  2. 郑州各个大学计算机专业分数线,2019年郑州大学各专业录取分数线
  3. java 解zip文件(ZipInputStream)
  4. 网络中的IP地址管理策略及其划分
  5. linux read() 函数
  6. 中心极限与大数定理律的关系_麦克斯韦速度分布律与气体分子碰壁数的推导
  7. smina 基于结构的虚拟筛选
  8. 去除WinRAR 5.01(32位) NAG窗口
  9. Qt几个月的学习心得及展望
  10. 广州百田2015校园招聘笔试题