篇一 :Java多线程总结

基本概念:

并发性和并行性:

并发性指的是同一时刻只能有一条指令执行,但是多个进程指令被快速轮换执行

并行性是指同一时刻,有多条指令在多个处理器上同时执行,使得在宏观上具有多个进程同时执行的结果

临界区:修改共享资源的代码区

1、线程实现有三种方式:

(1)类ThreadName(引用为a)继承Thread,然后调用a.start();

(2)类ThreadName(引用为b)实现接口Runnable,然后new Thread(b).start();

(3)类ThreadName(引用为c)实现接口Callable<Integer>,然后call方法作为执行体,会有返回值。

声明FutureTask<Integer> task = new FutureTask<Integer>(c);

Thead thread = new Thread(task).start();

一般采用实现接口的方式实现,有以下有优点:

使用实现Runnable接口和Callable接口的可以继续实现其他接口或继承

在这种方式下,多个线程可以共享一个target对象(共享线程类的实例属性),所以非常适合多个相同线程处理同一份资源的情况 实现Runnable和Callable的最大区别在于Callable是调用call方法,有返回值的

2、线程的生命周期:新建、就绪、运行、阻塞、死亡

线程在以下三种方式之一结束后就会处于死亡状态

(1)run()方法执行完成,线程正常结束

(2)线程抛出一个未捕获的Exception或Error

(3)直接调用该线程的stop()方法来结束该线程——该方法很容易导致对象受破坏,通常不推荐使用

3、线程的一些方法

join():等待另一线程执行完才执行

sleep():睡眠,不会释放对该同步监视器的锁定

…… …… 余下全文

篇二 :java多线程总结(含代码)

Java多线程总结

Java多线程总结

目标:

理解程序、线程和进程的概念

理解多线程的概念

掌握线程的各种状态

熟练使用Thread类、Runnable接口创建线程

熟练使用线程各种方法

1、程序、线程、进程

进程:调度和和独立运行的单位,使用了CPU

线程:是轻量级的进程,是进程的一个独立的连

2、线程的五种状态

新建:当一个

间没有占用CPU

CPU开始执行线程run()方法,子类必须重写run方法; 的使用权转让其他线程

run方法执行完毕时,线程进入死亡状态;

3

创建线程的两种方法:

(1)继承Thread类

(2)实现Runnable接口

继承Thread 类:

public class ThreadDemo extends Thread{

public void run(){

System.out.println(“Hello Java Thread”);

}

public static void main(String[] args){

Java多线程总结

new ThreadDemo().start();

}

}

实现Runnable接口

public class ThreadDemo implements Runnable{

public void run(){

System.out.println(“hello java Runnable”);

}

public static void main(String[] args){

new Thread(new ThreadDemo()).start();

}

}

4、线程的常用方法

设置线程名字:setName();

获取线程名字:getName();

主线程默认的名字可是:main

返回当前正在执行的线程:挂起线程:sleep();该方法要捕捉异常 Wait()后面详细讲解;

…… …… 余下全文

篇三 :Java多线程总结

Java多线程总结

线程的四种状态:

就绪Runable——运行中Running——阻塞Blocked——死亡Dead(结束)

线程的状态转换图

线程在一定条件下,状态会发生变化。线程变化的状态转换图如下:

1、新建状态(New):新创建了一个线程对象。

2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。

3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。

(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。

(三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。 线程的调度

1、调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会。 Java线程的优先级用整数表示,取值范围是1~10,Thread类有以下三个静态常量: static int MAX_PRIORITY 线程可以具有的最高优先级,取值为10。 static int MIN_PRIORITY 线程可以具有的最低优先级,取值为1。 static int NORM_PRIORITY 分配给线程的默认优先级,取值为5。

…… …… 余下全文

篇四 :Java多线程总结

多线程总结

在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java学习,请登陆疯狂java官网。

1.重写线程Thread,Runnable运行的是run方法,当调用线程start()时,会运行其run方法,

也可以主动去调用,只不过不在同一个线程里。

当一个线程既继承了Thread又继承Runnable,其thread必须调用target.run()实现对runnable的方法调用。

2.Object:的三种线程方法 wait() ,notify() ,notifyAll()

在某个线程里执行某个对象锁的wait方法会暂停该线程的运行,在另外一条线程里利用该锁的notify方法

可以唤醒某个该对象锁所在的线程;当该对象锁在多个线程里wait的时候,可以使用notifyAll唤醒运行。

3.线程调度-休眠/优先级/让步/合并/守护线程

休眠。静态方法Thread.sleep();谁调用谁休眠

对于优先级高的线程获取CPU机率比较大,并不一定优先级低的运行不了线程的让步含义就是使当前运行着线程让出CPU资源,但是然给谁不知道,仅仅是让出,线程状态回到可运行状态。Thread.yield()

线程的合并的含义就是将几个并行线程的线程合并为一个单线程执行,应用场景是当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法。 调用某个线程的join(),该线程运行完才运行调用它的线程代码。

守护线程的特征是当setDaemon(boolean on)将该线程标记为守护线程或用户线程。

当正在运行的线程都是守护线程时,Java 虚拟机退出。

该方法必须在启动线程前调用。实际上:JRE判断程序是否执行结束的标准是所有的前台执线程行完毕了,而不管后台线程的状态

4.线程的同步-同步方法/同步块

…… …… 余下全文

篇五 :Java多线程编程总结

Java线程:概念与原理

一、操作系统中线程和进程的概念


现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。


进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。

线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。

“同时”执行是人的感觉,在线程之间实际上轮换执行。

二、Java中的线程


在Java中,“线程”指两件不同的事情:
1、java.lang.Thread类的一个实例;

2、线程的执行。

使用java.lang.Thread类或者java.lang.Runnable接口编写代码来定义、实例化和启动新线程。

一个Thread类实例只是一个对象,像Java中的任何其他对象一样,具有变量和方法,生死于堆上。

Java中,每个线程都有一个调用栈,即使不在程序中创建任何新的线程,线程也在后台运行着。

一个Java应用总是从main()方法开始运行,mian()方法运行在一个线程内,它被称为主线程。

一旦创建一个新的线程,就产生一个新的调用栈。

线程总体分两类:用户线程和守候线程。


当所有用户线程执行完毕的时候,JVM自动关闭。但是守候线程却不独立于JVM,守候线程一般是由操作系统或者用户自己创建的

Java线程:创建与启动

一、定义线程

1、扩展java.lang.Thread类。

此类中有个run()方法,应该注意其用法:

public void run()

如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。

Thread 的子类应该重写该方法。

…… …… 余下全文

篇六 :Java多线程总结

Java多线程编程总结

Java语言的一个重要特点是内在支持多线程的程序设计。多线程是指在单个的程序内可以同时运行多个不同的线程完成不同的任务。多线程的程序设计具有广泛的应用。本章主要讲授线程的概念、如何创建多线程的程序、线程的生存周期与状态的改变、线程的同步与互斥等内容。

9.1 线程与线程类

9.1.1 线程的概念

线程的概念来源于计算机的操作系统的进程的概念。进程是一个程序关于某个数据集的一次运行。也就是说,进程是运行中的程序,是程序的一次运行活动。

线程和进程的相似之处在于,线程和运行的程序都是单个顺序控制流。有些教材将线程称为轻量级进程(light weight process)。线程被看作是轻量级进程是因为它运行在一个程序的上下文内,并利用分配给程序的资源和环境。

作为单个顺序控制流,线程必须在运行的程序中得到自己运行的资源,如必须有自己的执行栈和程序计数器。线程内运行的代码只能在该上下文内。因此还有些教程将执行上下文(execution context)作为线程的同义词。

所有的程序员都熟悉顺序程序的编写,如我们编写的名称排序和求素数的程序就是顺序程序。顺序程序都有开始、执行序列和结束,在程序执行的任何时刻,只有一个执行点。线程(thread)则是进程中的一个单个的顺序控制流。单线程的概念很简单,如图9.1所示。

多线程(multi-thread)是指在单个的程序内可以同时运行多个不同的线程完成不同的任务,图9.2说明了一个程序中同时有两个线程运行。

Java多线程总结

图9.1 单线程程序示意图 图9.2 多线程程序示意图

有些程序中需要多个控制流并行执行。例如,

Java多线程总结

for(int i = 0; i < 100; i++)

System.out.println("Runner A = " + i);

…… …… 余下全文

篇七 :java多线程总结

java多线程总结

java中的多线程

在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口。

对于直接继承Thread的类来说,代码大致框架是:

class类名 extendsThread{

方法1;

方法2;

publicvoidrun(){

// other code…

}

属性1;

属性2;

}

先看一个简单的例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

/**

* @author Rollen-Holt 继承Thread类,直接调用run方法

* */

classhello extendsThread {

publichello() {

}

publichello(String name) {

this.name = name;

}

publicvoidrun() {

for(inti = 0; i < 5; i++) {

System.out.println(name + "运行 "+ i);

}

}

publicstaticvoidmain(String[] args) {

hello h1=newhello("A");

hello h2=newhello("B");

h1.run();

h2.run();

}

privateString name;

}

【运行结果】:

A运行0

A运行1

A运行2

A运行3

A运行4

B运行0

B运行1

B运行2

…… …… 余下全文

篇八 :Java多线程总结

1、进程和线程

(1)多线程:一个应用程序有多条执行路径 进程: 正在运行的程序,是系统进行资源分配和调用的独立单位。 每一个进程都有它自己的内存空间和系统资源。 线程: 是进程中的单个顺序控制流,是一条执行路径。

单线程:

一个应用程序只有一条执行路径

多线程:

一个应用程序有多条执行路径

并行和并发:

前者是逻辑上同时发生,指在某一个时间内同时运行多个程序。

后者是物理上同时发生,指在某一个时间点同时运行多个程序。

多进程的意义?

提高CPU的使用率

多线程的意义?

提高应用程序的使用率

(2)Java程序的运行原理及JVM的启动是多线程的吗?

A:Java命令去启动JVM,JVM会启动一个进程,该进程会启动一个主线程去调用main方法 B:JVM的启动是多线程的,因为它最低有两个线程启动了,主线程和垃圾回收线程。

(3)多线程的实现方案

A:继承Thread类步骤:

a:自定义类MyThread继承Thread类。

b:MyThread类里面重写run()。

c:创建对象

d:启动线程

MyThread mt = new MyThread();

mt.start();

e:为什么是run()方法呢?

不是类中的所有代码都需要被线程执行的。而这个时候,为了区分哪些代码能够被线程执行,java提供了Thread类中的run()用来包含那些被线程执行的代码

调用run()方法为什么是单线程的呢?

因为run()方法直接调用其实就相当于普通的方法调用,所以你看到的是单线程的效果

面试题:run()和start()的区别?

run():仅仅是封装被线程执行的代码,直接调用是普通方法

start():首先启动了线程,然后再由jvm去调用该线程的run()方法。

B:实现Runnable接口步骤:

a:自定义类MyRunnable实现Runnable接口

…… …… 余下全文