Java学习手记2——多线程
一.线程的概念
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()里的程序代码。
import java.lang.*;
public class TestThread extends Thread{ public void run(){
System.out.println(Thread.currentThread().getName());
} public static void main(String[] args) {
Thread tt = new TestThread();
tt.start();//这里启动了另一个线程
System.out.println(Thread.currentThread().getName());
} }
运行结果:
main
Thread-0
2.实现Runable接口
细节:Thread这个类,构造方法有两个:Thread()和Thread(Runnable target)。
这里介绍第二个构造方法Thread(Runable target),这个Runnable是一个接口,接口里面定义了一个run()方法,可以将一个类引用这个接口,实现其中的run()方法,将需要多线程执行的代码放入run()方法中,然后用第二个构造方法调用这个实现了Runnable接口的类。不得不说接口是个神器
import java.lang.*;
public class TestThread implements Runnable{ public void run(){
System.out.println(Thread.currentThread().getName());
} public static void main(String[] args) {
Thread tt = new Thread(new TestThread());
tt.start();
System.out.println(Thread.currentThread().getName());
} }
运行结果:
main
Thread-0
3.这两种方式的区别
- Java中的类只能是单继承,所以当一个类已经是继承别个类的子类,又要加入多线程,就要用第二种实现Runnable接口的方法
- 由于两者构造方式不同,第一种方式每次都是新建对象来实现多线程,而第二种方式可以使多个线程共享一个对象(实现了Runnable接口的类的对象)的资源,可以根据情况来使用。
例如:模拟一个售票的过程,一共有一百张票,三个人分别售票。
import java.lang.*;
public class TestThread implements Runnable{
private int num = 100;
public void run(){
while(num-->=0)
System.out.println(Thread.currentThread().getName()+':'+num);
return;
} public static void main(String[] args) {
TextThread tt = new TestThread();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
System.out.println(Thread.currentThread().getName());
} }
运行部分结果:
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
Java学习手记2——多线程的更多相关文章
- 【原】Java学习笔记032 - 多线程
package cn.temptation; public class Sample01 { public static void main(String[] args) { /* * [进程]:正在 ...
- Java学习笔记之——多线程
多线程编程 程序: 进程:一个程序运行就会产生一个进程 线程:进程的执行流程,一个进程至少有一个线程,称为主线程 如:QQ聊着天,同时在听音乐 一个进程可以有多个线程,多个线程共享同一个进程的资源 线 ...
- java学习之路--多线程实现的方法
1 继承Thread类 继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Th ...
- Java学习笔记:多线程(一)
Java中线程的五种状态: 新建状态(New) 就绪状态(Runnable) 运行状态(Running) 阻塞状态(Blocked) 凋亡状态(Dead) 其中阻塞状态(Blocked)又分为三种: ...
- Java学习之并发多线程理解
1.线程简介: 世间万物会同时完成很多工作,如人体同时进行呼吸.血液循环.思考问题等活动,用户既可以使用计算机听歌也可以使用它打印文件,而这些活动完全可以同时进行,这种思想在Java中称为并发,而将并 ...
- java学习笔记(5)多线程
一.简介(过段时间再写,多线程难度有点大) --------------------------------------- 1.进程:运行时的概念,运行的应用程序 2.线程:应用程序内部并发执行的代码 ...
- Java 学习笔记(11)——多线程
Java内部提供了针对多线程的支持,线程是CPU执行的最小单位,在多核CPU中使用多线程,能够做到多个任务并行执行,提高效率. 使用多线程的方法 创建Thread类的子类,并重写run方法,在需要启动 ...
- Java学习手记1——集合
一.什么是集合 集合是对象的集合,就像数组是数的集合.集合是一种容器,可以存放对象(可以是不同类型的对象). 二.集合的优点(为什么要用集合) 当然,在java里,可以使用数组来存放一组类型相同的对象 ...
- Java学习笔记:多线程(二)
与线程生命周期相关的方法: sleep 调用sleep方法会进入计时等待状态,等待时间到了,进入就绪状态. yield 调用yield方法会让别的线程执行,但是不确保真正让出.较少使用,官方注释都说 ...
随机推荐
- vs发布的程序不依赖运行时库msvcp100.dll
[摘要:msvcr100.dll:MS Visual C Runtime 100 msvcp100.dll:MS Visual CPp 100 vs建立的工程,运转时库的范例有MD(MDd)战MT ...
- 数论 - Vanya and Computer Game
Vanya and his friend Vova play a computer game where they need to destroy n monsters to pass a level ...
- Git的简单使用教程
Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. GitHub则可以托管各种git库,并提供一个web界面,但与其它像 SourceForge或Google Code ...
- DEV 等待窗口
DevExpress.Utils.WaitDialogForm dlg = , )); System.Threading.Thread.Sleep(); dlg.Close();
- spring的显示装配bean(1)------通过XML文件装配
1:spring环境的简单搭建 (1)导入spring相关的jar包. 2:准备要进行装配的Java类 这里给出两个举例类 (1) (2) 3:配置XML文件 (1)在配置文件的顶部声明多个XML模式 ...
- C#编译执行过程
前言 大家好,我是卫斯理(Wesley).喜欢武侠的朋友可能知道小说中也有个卫斯理,他是位冒险家,财力充沛,极富冒险精神,并且有着超强的好奇心,对奇异的事情总有"打破沙锅问到底"的 ...
- 关于iPhone设备不同显示尺寸适配的一些方法
关于iPhone设备不同显示尺寸适配的一些方法 ------关于适配的理解------ 1.什么是适配? 适配是对不同硬件和系统软件的适应,硬件包括屏幕显示,处理器,内存等等(目前主要是屏幕适配, ...
- jQuery 使用索引值容易出错的一个地方
先看代码 $('input:eq(2)').attr('value', function(index, val){ console.log(index); //输出0 }); 问:当前元素的索引值,不 ...
- ACM集训的Training Day 3的A题。。。
A. 等差数列 一.题目描述: 一个等差数列是一个能表示成a, a+b, a+2b,..., a+nb (n=0,1,2,3,...)的数列. 在这个问题中a是一个非负的整数,b是正整数.写一个程序来 ...
- iOS超全开源框架、项目和学习资料汇总(5)AppleWatch、经典博客、三方开源总结篇
完整项目 v2ex – v2ex 的客户端,新闻.论坛.apps-ios-wikipedia – apps-ios-wikipedia 客户端.jetstream-ios – 一款 Uber 的 MV ...