java大数据技术入门(大数据编程入门)
java大数据技术入门(大数据编程入门)使用new关键字和Thread类或其子类创建线程对象后,则该线程对象处于新状态。它将保持此状态,直到程序start()线程。① 新建状态:多线程可以满足程序员编写高效的程序并充分利用CPU。线程是一个动态执行过程,和自然界的生物一样,它也有一个从产生到死亡的过程。以下将展示一个线程完整的生命周期图:
当执行一些耗时操作比如发起网络请求或者读取数据库时,常常会使用多线程编程,那么什么是多线程编程呢?今天小编为大家带来的是大数据编程入门: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多线程编程的全部内容了,希望这篇文章可以帮助到大家~