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()里的程序代码。

 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

时间: 2024-10-21 07:39:33

Java学习手记2——多线程的相关文章

Java学习笔记之多线程

/* 进程: 正在进行中的程序(直译). 线程: 就是进程中一个负责程序执行的控制单元(执行路径) 一个进程中可以有多个执行路径, 称之为多线程. 一个进程中至少要有一个线程. 开启多个线程是为了同时运行多部分代码. 每一个线程都有自己运行的内容. 这个内容可以称为线程要执行的任务. 多线程的好处: 解决了多部分同时运行的问题. 多线程的弊端: 线程太多回到效率的降低. 其实应用程序的执行都是cpu在做着快速的切换完成的. 这个切换是随机的. jvm启动时就启动了多个线程,至少有两个线程可以分析

Java学习笔记-8.多线程编程

一.引入线程 1.多线程和多进程的区别 (1)两者粒度不同,进程是由操作系统来管理,而线程则是在一个进程内 (2)每个进程是操作系统分配资源和处理器调度的基本单位,拥有独立的代码.内部数据和状态 而一个进程内的多线程只是处理器调度的基本单位,共享该进程的资源,线程间有可能相互影响 (3)线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担小 2.Thread类:Java的线程是通过java.lang.Thread类来实现,一个Thread对象代表一个线程

黑马程序员——JAVA学习笔记六(多线程)

1,    什么是多线程?一个程序可以执行多个任务,每一个任务称为一个线程,运行多个线程的程序称为多线程程序. 进程:正在进行中的程序(直译). 线程:进程中一个负责程序执行的控制单元(执行路径).   多线程的好处:解决了多部分代码同时运行的问题.多线程的弊端:线程太多,会导致效率的降低. 其实,多个应用程序同时执行都是CPU在做着快速的切换完成的.这个切换是随机的.CPU的切换是需要花费时间的,从而导致了效率的降低 2 ,    创建线程方式:  创建线程方式一:继承Thread类 1.定义

JAVA学习笔记之多线程专题(一):线程同步安全处理

关于多线程操作,我相信大家都不陌生,如何开启一个线程之类我想就不用太详细的去描述,今天我们就来讲讲线程同步的安全的问题. 对于线程同步安全问题,一般是一个多线程对同一个资源同时操作的时候,会出现资源同时操作造成线程不安全的问题.那么这个时候我们需要去对公共资源进行同步保护.这个时候有三种情况 1.同步代码块,这个同步的锁是任意一个对象: 2.方法同步,这个同步的锁就是该方法所在的类: 3.静态方法同步,这个同步的锁是该方法所在类的字节码. 接下来,我们举一个例子来说明多线程对同一个资源进行操作的

Java学习笔记之多线程二

看到一篇讲线程的故事性文章,觉得很有意思,很佩服作者能这么生动地讲述出来,点击可跳转阅读此文章:<我是一个线程> 继续我的笔记中总结 - - 理解线程安全问题: 下面是书上看到的卖票例子:模拟3个窗口同时在售10张票. 上篇博文笔记总结了多线程创建的两种方式,那我们就分别以这两种实现多线程的方式来解决这个场景. 使用继承于Thread类的方式 上Demo: class SaleTicket extends Thread { int num = 10; // 票数 public SaleTick

Java学习手记1——集合

集合主要有三类:Set,List,Map. 各个类的特点: Set:不能包含重复的元素.SortedSet是一个按照升序排列元素的Set. List:是一个有序的集合.可以包含重复的元素,提供了按照索引访问的方式.ArrayList常用作存放数组 Map:包含了key-value对.Map根据对应的key来查找value,所以不能包含重复的key,但是value可以重复.SortedMap是一个按照key升序排列的Map. 下图为集合框架中的实现类:

java多线程之路之同步器—Core Java学习

今天为大家介绍几种java内置的同步器. CountDownLatch:倒计数门栓 CountDownLatch让一个线程集等待直到计数变为0.该Latch为一次性的,一旦计数为0,就不能再使用了. Sample 1: public class Driver { public static void main(String[] args) throws InterruptedException { CountDownLatch startSignal = new CountDownLatch(1

JAVA学习笔记 -- 多线程之共享资源

在多线程程序运行过程中,可能会涉及到两个或者多个线程试图同时访问同一个资源.为了防止这种情况的发生,必须在线程使用共享资源时给资源"上锁",以阻挡其它线程的访问.而这种机制也常常被称为互斥量,本文主要介绍它的两种方式synchronized和Lock . 1.synchronized 当任务要执行被synchronized关键字保护的代码片段的时候,它会检查锁是否可用,然后获取锁,执行代码,释放锁.synchronized也有两种用法: A.synchronized方法 import

2016最新Java学习计划

一.Java学习路线图 二.Java学习路线图--视频篇 六大阶段 学完后目标 知识点 配套免费资源(视频+笔 记+源码+模板) 密码        第一阶段 Java基础 入门 学习周期: 35天 学完后目标: 1.可进行小型应用程序开发 2.对数据库进行基本的增删改查管理 市场价值:¥5000 计算机基础知识 计算机基础.DOS常用命令.Java概述.JDK环境安装配置.环境变量配置.Java程序入门 1.2015年Java基础视频-深入浅出精华版(强烈推荐) 2.历经5年锤炼(适合初学者入