首页 > 编程知识 正文

多线程java文档介绍内容(java多线程开发实例)

时间:2023-12-12 20:00:05 阅读:315030 作者:ECUR

本文目录一览:

JAVA多线程

class Info{ // 定义信息类

private String name = "李兴华"; // 定义name属性

private String content = "JAVA讲师" ; // 定义content属性

private boolean flag = false ; // 设置标志位

public synchronized void set(String name,String content){

if(!flag){

try{

super.wait() ;

}catch(InterruptedException e){

e.printStackTrace() ;

}

}

this.setName(name) ; // 设置名称

try{

Thread.sleep(300) ;

}catch(InterruptedException e){

e.printStackTrace() ;

}

this.setContent(content) ; // 设置内容

flag = false ; // 改变标志位,表示可以取走

super.notify() ;

}

public synchronized void get(){

if(flag){

try{

super.wait() ;

}catch(InterruptedException e){

e.printStackTrace() ;

}

}

try{

Thread.sleep(300) ;

}catch(InterruptedException e){

e.printStackTrace() ;

}

System.out.println(this.getName() +

" -- " + this.getContent()) ;

flag = true ; // 改变标志位,表示可以生产

super.notify() ;

}

public void setName(String name){

this.name = name ;

}

public void setContent(String content){

this.content = content ;

}

public String getName(){

return this.name ;

}

public String getContent(){

return this.content ;

}

};

class Producer implements Runnable{ // 通过Runnable实现多线程

private Info info = null ; // 保存Info引用

public Producer(Info info){

this.info = info ;

}

public void run(){

boolean flag = false ; // 定义标记位

for(int i=0;i50;i++){

if(flag){

this.info.set("李兴华","JAVA讲师") ; // 设置名称

flag = false ;

}else{

this.info.set("mldn","") ; // 设置名称

flag = true ;

}

}

}

};

class Consumer implements Runnable{

private Info info = null ;

public Consumer(Info info){

this.info = info ;

}

public void run(){

for(int i=0;i50;i++){

this.info.get() ;

}

}

};

public class ThreadCaseDemo03{

public static void main(String args[]){

Info info = new Info(); // 实例化Info对象

Producer pro = new Producer(info) ; // 生产者

Consumer con = new Consumer(info) ; // 消费者

new Thread(pro).start() ;

new Thread(con).start() ;

}

};

java中什么叫做线程?什么叫多线程?多线程的特点是什么?

线程的概念:Thread  每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。

多线程的概念:  多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。

多线程的特点:使用线程可以把占据长时间的程序中的任务放到后台去处理

用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度 。

程序的运行速度可能加快  ·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。

在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

线程定义比较抽象,简单的说就是一个代码执行流。许多执行流可以混合在一起由CPU调度。线程是允许各种任务交互执行的方式。

Java的线程在操作系统的实现模式依系统不同而不同,可能是系统级别的进程或线程,但对于程序员来说并没有影响。

任务交互的一个好处是增加程序响应。如一个界面程序执行一段耗时的数据库查询,使用单独的线程可以让界面依然响应用户的其他输入,而单线程只能等待查询结束再处理。

JVM以及操作系统会优先处理优先级别高的线程,但不代表这些线程一定会先完成。设定优先级只能建议系统更快的处理,而不能强制。

另外,在运行时,并没有按照函数分界,而是按照机器码/汇编码分界。也就是说不保证任何一段代码是被完整而不打断的执行的(除非你已经使用同步手段)。正由于如此,各种线程同步的方法应运而生。

Java多线程是什么意思?

Java多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。

1、继承Thread类实现多线程

继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。例如:

在合适的地方启动线程如下:

2、实现Runnable接口方式实现多线程

如果自己的类已经extends另一个类,就无法直接extends Thread,此时,必须实现一个Runnable接口,如下:

为了启动MyThread,需要首先实例化一个Thread,并传入自己的MyThread实例:

事实上,当传入一个Runnable target参数给Thread后,Thread的run()方法就会调用target.run(),参考JDK源代码:

3、使用ExecutorService、Callable、Future实现有返回结果的多线程

ExecutorService、Callable、Future这个对象实际上都是属于Executor框架中的功能类。想要详细了解Executor框架的可以访问 ,这里面对该框架做了很详细的解释。返回结果的线程是在JDK1.5中引入的新特征,确实很实用,有了这种特征我就不需要再为了得到返回值而大费周折了,而且即便实现了也可能漏洞百出。

可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了,再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。下面提供了一个完整的有返回结果的多线程测试例子,在JDK1.5下验证过没问题可以直接使用。代码如下:

代码说明:

上述代码中Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。

public static ExecutorService newFixedThreadPool(int nThreads) 

创建固定数目线程的线程池。

public static ExecutorService newCachedThreadPool() 

创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。

public static ExecutorService newSingleThreadExecutor() 

创建一个单线程化的Executor。

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 

创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。

总结:ExecutoreService提供了submit()方法,传递一个Callable,或Runnable,返回Future。如果Executor后台线程池还没有完成Callable的计算,这调用返回Future对象的get()方法,会阻塞直到计算完成。

java 多线程是什么?

线程定义比较抽象,简单的说就是一个代码执行流。许多执行流可以混合在一起由CPU调度。线程是允许各种任务交互执行的方式。

Java的线程在操作系统的实现模式依系统不同而不同,可能是系统级别的进程或线程,但对于程序员来说并没有影响。

任务交互的一个好处是增加程序响应。如一个界面程序执行一段耗时的数据库查询,使用单独的线程可以让界面依然响应用户的其他输入,而单线程只能等待查询结束再处理。

JVM以及操作系统会优先处理优先级别高的线程,但不代表这些线程一定会先完成。设定优先级只能建议系统更快的处理,而不能强制。

另外,在运行时,并没有按照函数分界,而是按照机器码/汇编码分界。也就是说不保证任何一段代码是被完整而不打断的执行的(除非你已经使用同步手段)。正由于如此,各种线程同步的方法应运而生。

离线编辑 java中级课程大纲java中级课程大纲 线程介绍 什么是多线程 多线程

课程简介:

随着多核时代的兴起,现在的服务器CPU可能多达10个以上的内核。对于并发编程的市场需求量激增,那么如何才能将多核CPU的性能发挥到极致呢?

而Java作为服务端编程使用最广泛的语言,必然需要和多核CPU打交道。那Java为我们提供了哪些并发编程的工具呢?

本课程将重点介绍基于Java语言的并行程序设计。内容将涵盖多线程基础、并发库解析以及高并发程序设计思路等多个方面。

如何写出正确的并行代码,而且是写出高性能的程序,本课程都会给你答案!

课程大纲:

第1课:前言和多线程基础

为什么需要并行

有关并行的重要概念

有关并行性能的2个重要定律

第2课:多线程基础

线程的基本操作

守护线程

优先级

中断处理

基本的线程同步操作

第3课:Java内存模型和线程安全

原子性

可见性

有序性

Happen-Before 规则

线程安全的概念

线程安全的反例

第4课:JDK并发包

各种同步控制工具的使用

并发容器及典型源码分析

同步工具、并发容器使用小案例

第5课:JDK并发包

线程池的基本使用

扩展和增强线程池

线程池及其核心代码分析

ForkJoin

第6课:并发设计模式

单例

不变模式

生产者消费者

Future模式

第7课:无锁

无锁类的使用

无锁类的原理详解

无锁算法详解

第8课:NIO和AIO

NIO的好处

NIO核心类介绍

Selector的多路复用

使用NIO进行网络编程案例

AIO介绍

第9课:锁的优化和注意事项

锁优化的思路和方法

虚拟机内的锁优化

死锁

一个错误使用锁的案例

ThreadLocal及其源码分析

第10课:并发调试与JDK8新特性

多线程调试的方法

多线程调试案例

线程dump及分析

JDK8对并发的新支持

第11课:综合案例:jetty核心代码分析

jetty如何处理高并发

实现高并发程序的基本思想

什么是Java多线程

多线程的概念?

说起多线程,那么就不得不说什么是线程,而说起线程,又不得不说什么是进程。

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

进程可以简单的理解为一个可以独立运行的程序单位。它是线程的集合,进程就是有一个或多个线程构成的,每一个线程都是进程中的一条执行路径。

那么多线程就很容易理解:多线程就是指一个进程中同时有多个执行路径(线程)正在执行。

为什么要使用多线程?

1.在一个程序中,有很多的操作是非常耗时的,如数据库读写操作,IO操作等,如果使用单线程,那么程序就必须等待这些操作执行完成之后才能执行其他操作。使用多线程,可以在将耗时任务放在后台继续执行的同时,同时执行其他操作。

2.可以提高程序的效率。

3.在一些等待的任务上,如用户输入,文件读取等,多线程就非常有用了。

缺点:

1.使用太多线程,是很耗系统资源,因为线程需要开辟内存。更多线程需要更多内存。

2.影响系统性能,因为操作系统需要在线程之间来回切换。

3.需要考虑线程操作对程序的影响,如线程挂起,中止等操作对程序的影响。

4.线程使用不当会发生很多问题。

总结:多线程是异步的,但这不代表多线程真的是几个线程是在同时进行,实际上是系统不断地在各个线程之间来回的切换(因为系统切换的速度非常的快,所以给我们在同时运行的错觉)。

2.多线程与高并发的联系。

高并发:高并发指的是一种系统运行过程中遇到的一种“短时间内遇到大量操作请求”的情况,主要发生在web系统集中大量访问或者socket端口集中性收到大量请求(例如:12306的抢票情况;天猫双十一活动)。该情况的发生会导致系统在这段时间内执行大量操作,例如对资源的请求,数据库的操作等。如果高并发处理不好,不仅仅降低了用户的体验度(请求响应时间过长),同时可能导致系统宕机,严重的甚至导致OOM异常,系统停止工作等。如果要想系统能够适应高并发状态,则需要从各个方面进行系统优化,包括,硬件、网络、系统架构、开发语言的选取、数据结构的运用、算法优化、数据库优化……。

而多线程只是在同/异步角度上解决高并发问题的其中的一个方法手段,是在同一时刻利用计算机闲置资源的一种方式。

多线程在高并发问题中的作用就是充分利用计算机资源,使计算机的资源在每一时刻都能达到最大的利用率,不至于浪费计算机资源使其闲置。

3.线程的创建,停止,常用方法介绍。

1.线程的创建:

线程创建主要有2种方式,一种是继承Thread类,重写run方法即可;(Thread类实现了Runable接口)

另一种则是实现Runable接口,也需要重写run方法。

线程的启动,调用start()方法即可。 我们也可以直接使用线程对象的run方法,不过直接使用,run方法就只是一个普通的方法了。

其他的还有: 通过匿名内部类的方法创建;实现Callable接口。。。。。

2.线程常用方法:

currentThread()方法:该方法返回当前线程的信息 .getName()可以返回线程名称。

isAlive()方法:该方法判断当前线程是否处于活动状态。

sleep()方法:该方法是让“当前正在执行的线程“休眠指定的时间,正在执行的线程是指this.currentThread()返回的线程。

getId()方法:该方法是获取线程的唯一标识。

3.线程的停止:

在java中,停止线程并不简单,不想for。。break那样说停就停,需要一定的技巧。

线程的停止有3种方法:

1.线程正常终止,即run()方法运行结束正常停止。

2.使用interrupt方法中断线程。

3.使用stop方法暴力停止线程。

interrupt方法中断线程介绍:

interrupt方法其实并不是直接中断线程,只是给线程添加一个中断标志。

判断线程是否是停止状态:

this.interrupted(); 判断当前线程是否已经中断。(判断的是这个方法所在的代码对应的线程,而不是调用对象对应的线程)

this.isInterrupted(); 判断线程是否已经中断。(谁调用,判断谁)

注:.interrupted()与isInterrupted()的区别:

interrupted()方法判断的是所在代码对应的线程是否中断,而后者判断的是调用对象对应的线程是否停止

前者执行后有清除状态的功能(如连续调用两次时,第一次返回true,则第二次会返回false)

后者没有清除状态的功能(两次返回都为true)

真正停止线程的方法:

异常法:

在run方法中 使用 this.interrupted();判断线程终止状态,如果为true则 throw new interruptedException()然后捕获该异常即可停止线程。

return停止线程:

在run方法中 使用 this.interrupted();判断线程终止状态,如果为true则return停止线程。 (建议使用异常法停止线程,因为还可以在catch中使线程向上抛,让线程停止的事件得以传播)。

暴力法:

使用stop()方法强行停止线程(强烈不建议使用,会造成很多不可预估的后果,已经被标记为过时)

(使用stop方法会抛出 java.lang.ThreadDeath 异常,并且stop方法会释放锁,很容易造成数据不一致)

注:在休眠中停止线程:

在sleep状态下停止线程 会报异常,并且会清除线程状态值为false;

先停止后sleep,同样会报异常 sleep interrupted;

4.守护线程。

希望对您有所帮助!~

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。