一.线程的概念

CPU执行程序,就好比一个人在干事情一样,同一个时间你只能做一件事情,但是这样的效率实在是太低了,在你用电脑的时候,听歌就不能浏览网页,看电影就不能下载视频,你想想是不是很蛋疼。

所以为了解决这个问题,CPU设计成了分时处理的方式,即不同的时间CPU做不同的事情,这样就大大提高了效率,能这样做的原因是因为CPU相对于人的接收信息的速度,快得多!也就是说,你边听歌边浏览网页,看上去好像音乐播放器和浏览器两个程序在同时工作,其实他们是分时在工作,即播放器工作一会,浏览器工作一会,这样交叉执行的,只不过是你接受信息的速度很慢,所以感觉不到而已。

那么多线程,和多个程序是一样的道理,多线程是一个程序内部的多个子任务分时执行。比如:qq的视频聊天,你可以边看视频,边发消息,这就是两个线程。

PS:另外,好多人解释进程和线程的区别,用一大堆抽象的概念,说的跟没说一样,晦涩难懂,在我看来,进程和线程都是运行着的程序,只不过进程是运行着的独立的程序(比如:QQ,LOL,QQ影音),而线程是一个独立的程序里面的运行着的子程序(比如:QQ里的首发消息,收发加播放视频,上下载文件等),如果把线程抽离出来,也是一个进程。之所以拿这两个比较,还有一个原因是他们的另外一个共同点:都是分时执行的。即进程是不同程序的分时执行(比如用QQ的同时可以玩LOL),而线程是一个程序内部多个子程序的分时执行(比如用QQ聊天的时候可以接受并播放对方摄像头传过来的视频,同时还可以上下载文件)。

二.Java中的线程的实现方式

在Java中,实现多线程有两种方式:

1.继承 Thread类

细节:继承Thread类之后,重写run()方法,把要实现多线程的代码敲进run()方法里,然后在main函数中实例化这个类(即之前继承并重写run()方法的类)的对象,并调用继承的start()方法,从该方法调用的地方开始,CPU便会利用空闲时间段执行run()里的程序代码。

 1 import java.lang.*;
 2 public class TestThread extends Thread{
 3
 4     public void run(){
 5         System.out.println(Thread.currentThread().getName());
 6     }
 7
 8
 9     public static void main(String[] args) {
10         Thread tt = new TestThread();
11         tt.start();//这里启动了另一个线程
12         System.out.println(Thread.currentThread().getName());
13     }
14
15 }

运行结果:

main
Thread-0

2.实现Runable接口

细节:Thread这个类,构造方法有两个:Thread()和Thread(Runnable target)。

这里介绍第二个构造方法Thread(Runable target),这个Runnable是一个接口,接口里面定义了一个run()方法,可以将一个类引用这个接口,实现其中的run()方法,将需要多线程执行的代码放入run()方法中,然后用第二个构造方法调用这个实现了Runnable接口的类。不得不说接口是个神器

 1 import java.lang.*;
 2 public class TestThread implements Runnable{
 3
 4     public void run(){
 5         System.out.println(Thread.currentThread().getName());
 6     }
 7
 8
 9     public static void main(String[] args) {
10         Thread tt = new Thread(new TestThread());
11         tt.start();
12         System.out.println(Thread.currentThread().getName());
13     }
14
15 }

运行结果:

main
Thread-0

3.这两种方式的区别

  • Java中的类只能是单继承,所以当一个类已经是继承别个类的子类,又要加入多线程,就要用第二种实现Runnable接口的方法
  • 由于两者构造方式不同,第一种方式每次都是新建对象来实现多线程,而第二种方式可以使多个线程共享一个对象(实现了Runnable接口的类的对象)的资源,可以根据情况来使用。

例如:模拟一个售票的过程,一共有一百张票,三个人分别售票。

 1 import java.lang.*;
 2 public class TestThread implements Runnable{
 3     private int num = 100;
 4     public void run(){
 5         while(num-->=0)
 6         System.out.println(Thread.currentThread().getName()+':'+num);
 7         return;
 8     }
 9
10
11     public static void main(String[] args) {
12         TextThread tt = new TestThread();
13         new Thread(tt).start();
14         new Thread(tt).start();
15         new Thread(tt).start();
16         System.out.println(Thread.currentThread().getName());
17     }
18
19 }

运行部分结果:

Thread-2:91
Thread-2:90
Thread-2:89
Thread-2:88
Thread-2:87
Thread-1:86
Thread-1:84
Thread-1:83

三.Thread类中一些其他的方法

static Thread curruntThread() 返回当前正在执行的线程对象的引用

String getName() 返回该线程名称

void join() 在当前位置插入该线程

void join(long millis) 在当前位置插入该线程执行millis毫秒,继续之前的线程

2016-08-26 01:16:19

转载于:https://www.cnblogs.com/jizhji/p/5808836.html

Java学习手记2——多线程相关推荐

  1. Java学习笔记5-1——多线程

    目录 前言 核心概念 线程创建 继承Thread类 实现Runnable接口 上述两个方法小结 实现Callable接口 并发问题简介 静态代理模式 线程状态 线程停止(stop) 线程休眠(slee ...

  2. 2019-06-03 Java学习日记 day24 多线程

    多线程 线程是程序执行的一台路径,一个进程中可以包含多条线程 多线程并发执行可以提高程序的效率,可以同时完成多项工作 多线程的应用背景 红蜘蛛同时共享屏幕给多个电脑 迅雷开启多条线程一起下载 QQ同时 ...

  3. 2019-06-03 Java学习日记之多线程下GUI

    多线程下 单例设计模式: 保证类在内存中只有一个对象 如何保证类在内存中只有一个对象呢? 1.控制类的创建,不让其他类来创建本类的对象 2.在本类中定义一个本类的对象,Singleton s 3.提供 ...

  4. Java学习笔记2 多线程简单总结

    多线程简单总结 1. 相关概念 1.1 线程与进程 进程 线程 1.2 线程调度 分时调度 抢占式调度 1.3 同步与异步 同步 异步 1.4 并发与并行 并发 并行 2. 创建线程 2.1 继承Th ...

  5. JAVA学习笔记--4.多线程编程 part5.这些年的那些坑

    2019独角兽企业重金招聘Python工程师标准>>> 基本要求 没指定线程name. 没有限定线程个数. Thread#stop等被废弃的方法不安全,详见TODO. 注意锁作用的对 ...

  6. JAVA学习笔记--4.多线程编程 part1.背景知识和内存模型

    2019独角兽企业重金招聘Python工程师标准>>> 背景知识 CPU Cache 如上简易图所示,在当前主流的CPU中,每个CPU有多个核组成的.每个核拥有自己的寄存器,L1,L ...

  7. java学习笔记(九)----多线程

    class ThreadDemo1 { public static void main(String[] args)   { new TestThread().start(); //用start()默 ...

  8. Java学习笔记5-2——多线程

    目录 线程同步 三大不安全案例 一.不安全的买票过程 二.不安全的取钱过程 三.线程不安全的集合 synchronized 解决三大不安全案例 一.解决不安全的买票过程 二.解决不安全的取钱过程 三. ...

  9. 【Java学习0331】多线程

    第七章 多线程 模拟车站售票 package com.share.test_3_31;public class CheZhan {public int num = 100;public int id ...

最新文章

  1. python list同步删除
  2. 18. 编写FTP客户端程序
  3. CXF客户端配置请求超时限制
  4. 程序员,请您不要老是熬夜
  5. php注册界面模板,WeUI注册页面
  6. 【算法小积累】 - 提取非0数最右侧的1
  7. C语言代码规范(八)使用const修饰值不允许改变的变量
  8. python编写代码_用 Python 编写干净、可测试、高质量的代码
  9. 常见Web技术之间的关系,你知道多少?
  10. C Primer Plus(6) 中文版 第5章 运算符、表达式和语句 5.5 类型转换
  11. 夜雨数竞笔记-不定积分(1)-换元法-倒代换
  12. 【经验分享】IT领域7年工作经验和建议
  13. 基于Spring+SpringMVC+MyBatis博客系统的开发教程(十六)
  14. 动作捕捉系统用于机器人关节位移与几何参数标定
  15. Iterm2 + zsh 安装教程
  16. 韩国NF数字功放芯片在家庭影院领域中的应用
  17. VMware虚拟机不能全屏
  18. vue3 组件篇 Affix
  19. 2020年8月Android手机性能榜,安卓中端手机性能排行榜-2020年8月发布
  20. 30道python自动化测试面试题

热门文章

  1. 扪心自问!一百多道难搞的面试题,你能答对了多少?
  2. Java 如何线程间通信,面试被问哭。。。
  3. 5年没有工资收入,他如何支撑世界上最大的免费编程社区?
  4. 数据库并发控制,选择乐观锁还是悲观锁?
  5. 多线程:并发实现方法之J.U.C
  6. 升级Springboot版本异常:HateoasConfiguration required a single bean, but 3 were found
  7. php判断base64编码,检测PHP中的base64编码?
  8. 50兆 svg 文件超过_用svg+css3实现支付宝App波浪功能
  9. feature map 意义_FeatureMap Viewer以及中心化对统计分布变化的影响讨论
  10. cookie被淘汰_session正在被淘汰吗?