主页 > 新闻资讯 > 大数据编程入门:Java多线程编程

大数据编程入门:Java多线程编程

作者:游老师 浏览次数: 2021-08-04 14:58
当执行一些耗时操作比如发起网络请求或者读取数据库时,常常会使用多线程编程,那么什么是多线程编程呢?今天小编为大家带来的是大数据编程入门:Java多线程编程。
一、Java多线程概念
Java为多线程编程提供了内置支持。线程是指进程中的单个顺序控制流。一个进程中可以有多个线程并发,每个线程并行执行不同的任务。
多线程是多任务处理的一种特殊形式,但多线程使用较少的资源开销。
这里定义了另一个与线程相关的术语-进程:进程包括操作系统分配的内存空间,并包含一个或多个线程。线程不能独立存在,这必须是一个过程的一部分。进程将一直运行,直到所有非守护进程线程都完成运行。
多线程可以满足程序员编写高效的程序并充分利用CPU。
二、一个线程的生命周期
线程是一个动态执行过程,和自然界的生物一样,它也有一个从产生到死亡的过程。
以下将展示一个线程完整的生命周期图:
① 新建状态
使用new关键字和Thread类或其子类创建线程对象后,则该线程对象处于新状态。它将保持此状态,直到程序start()线程。
② 就绪状态:
当线程对象调用start()方法时,线程进入就绪状态。处于就绪状态的线程位于就绪队列中,需要等待JVM中线程调度器的调度。
③ 运行状态:
如果就绪线程获得CPU资源,它可以执行run(),并且线程正在运行。处于运行状态的线程是最复杂的,可能会被阻塞、就绪和失效。
④ 阻塞状态:
如果线程执行sleep、suspend和其他方法并丢失其占用的资源,则该线程将从运行状态进入阻塞状态。睡眠时间到期或设备资源已获得后,可以重新进入就绪状态,可分为三种类型:
A. 等待阻塞:处于运行状态的线程执行wait()方法,使线程进入等待阻塞状态。
B. 同步阻塞:线程无法获取同步同步锁(因为同步锁被其他线程占用)。
C. 其他阻塞:当通过调用线程的sleep()或join()发出I/O请求时,线程将进入阻塞状态。当sleep()状态超时时,join()等待线程终止或超时,或者I/O处理完成,线程返回就绪状态。
⑤ 死亡状态
当正在运行的线程完成任务或出现其他终止条件时,该线程将切换到终止状态。
三、线程的的优先级
每个java线程都有一个优先级,这有助于操作系统确定线程的调度顺序。
java线程的优先级是一个值范围为1(Thread.MIN_PRIORITY )-10(Thread.MAX_PRIORITY )默认情况下,每个线程都被分配一个优先级NORM_PRIORITY(5)。
优先级越高的线程对程序越重要,处理器资源应该在优先级较低的线程之前分配。然而,线程优先级并不能保证线程的执行顺序,它非常依赖于平台。
四、创建一个线程
在Java中 提供了三种创建线程的方法:
① 通过实现 Runnable 接口;
② 通过继承 Thread 类本身;
③ 通过 Callable 和 Future 创建线程。
五、通过实现Runnable接口来创建线程
创建线程的最简单方法是创建一个实现Runnable接口的类。
类只需要执行一个方法调用run()就可以实现Runnable,声明如下:
public void run()
可以重写此方法,重要的是要理解run()可以调用其他方法、使用其他类和声明变量,就像主线程一样。
在Runnable接口的类实现后,可以在类中实例化一个线程对象。
下面是Thread定义的一种常用的构造方法:
Thread(Runnable threadOb,String threadName);
上面的threadOb是实现Runnable接口的类的实例,threadName指定新线程的名称。
创建新线程后,在它运行之前调用它的start()方法。
void start();
以下是一个创建并执行的线程实例:
 
运行结果:
 
六、通过继承Thread来创建线程
创建线程的第二种方法是创建继承Thread类的新类,然后创建该类的实例。
继承的类必须重写run()方法,该方法是新线程的入口点。它还必须调用start()方法来执行。
尽管此方法被列为多线程实现,但它本质上是Runnable接口的一个实例。
运行结果:
七、Thread方法
1、下面是Thread类的一些重要方法的列表:
方法 描述
public void start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
public void run() 如果线程是使用独立的Runnable运行对象构造的,则调用Runnable对象的run方法;否则,该方法不执行任何操作并返回。
public final void setName(String name) 改变线程名称,使之与参数 name 相同。
public final void setPriority(int priority) 更改线程的优先级。
public final void setDaemon(boolean on) 将该线程标记为守护线程或用户线程。
public final void join(long millisec) 等待该线程终止的时间最长为 millis 毫秒。
public void interrupt() 中断线程。
public final boolean isAlive() 测试线程是否处于活动状态。
2、测试线程是否处于活动状态,Thread对象调用上述方法。以下方法是Thread类的静态方法。
方法 描述
public static void yield() 暂停当前正在执行的线程对象,并执行其他线程。
public static void sleep(long millisec) 将当前执行的线程休眠(暂停)指定的毫秒数,这受系统计时器和计划程序的准确性和准确性的影响。
public static boolean holdsLock(Object x) 当且仅当当前线程在指定的对象上保持监视器锁时,才返回 true。
public static Thread currentThread() 返回对当前正在执行的线程对象的引用。
public static void dumpStack() 将当前线程的堆栈跟踪打印至标准错误流。
3、实例
下面的ThreadClassDemo 程序演示了Thread类的一些方法:
 
 
运行结果:
八、通过 Callable 和 Future 创建线程
1、创建Callable接口的实现类并实现call()方法,该方法将用作线程执行器并具有返回值。
2、创建Callable实现类的实例,并使用FutureTask类包装Callable对象。FutureTask对象封装了Callable对象的call()方法的返回值。
3、使用FutureTask对象作为Thread对象的target,创建并启动新线程。
4、调用FutureTask对象的get()方法,获取子线程执行后的返回值。
实例:
九、创建线程的三种方式的对比
1、当通过实现Runnable和Callable接口创建多个线程时,线程类只实现Runnable接口或Callable接口,还可以继承其他类。
2、通过继承Thread类创建多线程时,易于编写,如果需要访问当前线程,则不需要使用Thread.currentThread() 方法,您可以直接使用this来获取当前线程。
十、线程的几个主要概念
在使用多线程编程时,需要了解下面的这几个概念:
① 线程同步
② 线程间通信
③ 线程死锁
④ 线程控制:挂起、停止和恢复
十一、多线程的使用
有效利用多线程的关键是理解程序是并发执行的,而不是串行执行的。例如,程序中有两个子系统需要同时执行。此时,需要多线程编程。
通过使用多线程,我们可以编写一个非常高效的程序。但是,请注意,如果创建太多线程,程序执行的效率实际上会降低,而不是提高。
记住,上下文切换开销也很重要,果创建的线程太多,CPU将花费比执行程序更多的时间进行上下文切换!
以上就是关于大数据编程入门:Java多线程编程的全部内容了,希望这篇文章可以帮助到大家~
热点排行
推荐文章
立即申请>>