1、定义任务
线程可以驱动任务,因此需要一种描述任务的方式,这可以由Runnable接口来提供,要想定义任务,只需实现Runnable接口并编写run()方法,使得该任务可以执行你的命令,要想实现线程行为,必须显式地将一个任务附着到线程上,例如:
import java.util.*;
public class TimePrinter implements Runnable {
int pauseTime;
String name;
public TimePrinter(int x, String n) {
pauseTime = x;
name = n;
}
public void run() {
while (true) {
try {
System.out.println(name + ":"+ new Date(System.currentTimeMillis()));
Thread.sleep(pauseTime);
} catch (Exception e) {
e.printStackTrace();
}
}
}
static public void main(String args[]) {
//将任务附着到Thread上
Thread t1 = new Thread(new TimePrinter(1000, "Fast Guy"));
t1.start();
Thread t2 = new Thread(new TimePrinter(3000, "Slow Guy"));
t2.start();
}
}
2、Thread 类
Thread 类是一个具体的类,即不是抽象类,该类封装了线程的行为。要创建一个线程,程序员必须创建一个从 Thread 类导出的新类。程序员必须覆盖 Thread 的 run() 函数来完成有用的工作。用户并不直接调用此函数;而是必须调用 Thread 的 start() 函数,该函数再调用 run()。
import java.util.*;
public class TimePrinter extends Thread {
int pauseTime;
String name;
public TimePrinter(int x, String n) {
pauseTime = x;
name = n;
}
public void run() {
while (true) {
try {
System.out.println(name + ":"+ new Date(System.currentTimeMillis()));
Thread.sleep(pauseTime);
} catch (Exception e) {
e.printStackTrace();
}
}
}
static public void main(String args[]) {
TimePrinter thread1=new TimePrinter(1000, "Fast Guy");
thread1.start();
}
}
3、使用Executor
Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等
并发编程的一种编程方式是把任务拆分为一些列的小任务,即Runnable,然后在提交给一个Executor执行,Executor.execute(Runnalbe) 。
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类。
Executor executor = Executors.newFixedThreadPool(10);
Runnable task = new Runnable() {
@Override
public void run() {
System.out.println("task over");
}
};
executor.execute(task);
executor = Executors.newScheduledThreadPool(10);
ScheduledExecutorService scheduler = (ScheduledExecutorService) executor;
scheduler.scheduleAtFixedRate(task, 10, 10, TimeUnit.SECONDS);
4、使用Callable,Future返回结果
Future<V>代表一个异步执行的操作,通过get()方法可以获得操作的结果,如果异步操作还没有完成,则,get()会使当前线程阻塞。FutureTask<V>实现了Future<V>和Runable<V>。Callable代表一个有返回值得操作。
Callable<Integer> func = new Callable<Integer>(){
public Integer call() throws Exception {
System.out.println("inside callable");
Thread.sleep(1000);
return new Integer(8);
}
};
FutureTask<Integer> futureTask = new FutureTask<Integer>(func);
Thread newThread = new Thread(futureTask);
newThread.start();
try {
System.out.println("blocking here");
Integer result = futureTask.get();
System.out.println(result);
} catch (InterruptedException ignored) {
} catch (ExecutionException ignored) {
}
ExecutoreService提供了submit()方法,传递一个Callable,或Runnable,返回Future。如果Executor后台线程池还没有完成Callable的计算,这调用返回Future对象的get()方法,会阻塞直到计算完成。
分享到:
相关推荐
Java线程是并发编程的基础,它允许程序同时执行多个任务,极大地提高了程序的效率和响应速度。在Java中,有四种主要的线程创建方法,它们各有特点,适应不同的应用场景。接下来,我们将深入探讨这四种方式及其使用...
此外,Java中的线程创建方式还包括使用Runnable接口、Thread类、Executor框架等。不同的线程创建方式都有其优缺,需要根据实际情况选择合适的线程创建方式。 本文主要介绍了Java使用Callable和Future创建线程操作的...
根据提供的信息,我们可以推断出这份文档主要关注的是Java线程的相关内容。下面将围绕“Java线程”这一主题展开详细的介绍与解释。 ### Java线程基础 在Java语言中,线程是程序执行流的基本单元。一个标准的Java...
本文将深入探讨Java线程的概念、生命周期、实现方式以及相关的同步机制。 首先,理解线程的基本概念至关重要。线程是程序中一个单一的顺序控制流,它在程序的上下文中运行,但具有独立的执行路径。多线程则是指在...
Java线程状态流转图是一种用于描述Java线程生命周期中不同的状态和状态转换的图形表示方式。该图形展示了Java线程从创建到终止的整个生命周期,并详细介绍了每种状态的特点和转换规则。 NEW(初始化状态) 在Java...
线程最基本的知识,主要是创建线程,等等。
### Java多线程-JDK5.0新增线程创建方式 #### 一、新增方式1:实现Callable接口 ##### (1)介绍 自Java 5.0起,为提高线程管理的灵活性与效率,引入了`Callable`接口,这是一种全新的创建线程的方式。与传统的`...
### Java线程创建与管理:深入理解与实践指南 #### 引言 多线程作为Java程序设计中的重要概念之一,使开发者能够构建并行执行的任务,进而提高程序的效率和响应速度。Java语言提供了丰富的工具和技术来支持线程的...
Java线程是多任务编程的重要概念,它允许程序同时执行多个独立的任务,从而提高系统效率和响应速度。在Java中,线程可以分为用户线程和守护线程,前者是程序运行的基础,而后者是在所有用户线程结束时才终止的后台...
在Java编程语言中,创建线程是实现并发执行任务的关键步骤。Java提供了两种主要的方法来创建线程,分别是直接继承自`Thread`类和实现`Runnable`接口。这两种方法各有其特点和适用场景。 1. **继承Thread类**: 当...
学习Java线程,理解其创建、状态转换、调度和控制,以及如何处理线程间的互斥和同步,对于开发高效、稳定的并发程序至关重要。通过深入研究这些概念,开发者能够编写出更符合现代计算需求的高质量软件。
Java线程是Java编程语言中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的并发性和效率。本教程将深入探讨Java线程的使用,帮助开发者掌握这一关键技术。 一、线程基础 1. **线程的概念**:线程...
《Java线程(第三版)》是一本深入探讨Java线程技术的专业书籍,旨在帮助开发者理解和掌握Java平台上的多线程编程。Java线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而充分利用系统资源,提高程序的...
创建Java线程有两种方式:继承`Thread`类并重写`run()`方法,或者实现`Runnable`接口并提供`run()`方法。当线程对象被创建并调用`start()`方法后,线程进入可运行态,由Java的线程调度器决定何时执行`run()`方法。 ...
JAVA线程dump的分析 JAVA线程dump是指在JAVA程序中,当前线程的状态和调用堆栈的快照,能够帮助开发者了解当前程序的执行情况,诊断问题和性能瓶颈。生成JAVA线程dump的方法在不同的操作系统下是不同的,在Windows...
Java线程是Java编程语言中...以上知识点覆盖了Java线程的基础概念、创建方式、状态管理、同步机制以及高级特性,是Java程序员必须掌握的重要内容。通过深入理解和熟练应用这些知识,可以编写出高效、安全的多线程程序。
2. **线程创建**:Java提供两种方式创建线程,一是直接继承Thread类并重写run()方法,二是实现Runnable接口并定义run()方法,然后通过Thread类的构造函数将Runnable对象传递进去。 3. **线程交互**:线程之间的通信...
#### 三、Java线程的创建方式 **3.1 继承Thread类** 这是创建线程最常见的方式之一。通过继承`Thread`类并重写其`run()`方法,可以定义线程的行为。然后通过调用`start()`方法来启动线程。 ```java public class ...
1. **线程的创建**:在Java中,有两种主要的线程创建方式——继承Thread类和实现Runnable接口。每种方法各有优缺点,需要根据实际需求选择。 2. **线程的启动与生命周期**:通过调用start()方法启动线程,线程将...
本示例"简单的Java线程demo"旨在帮助初学者理解如何在Java中创建和管理线程。 在Java中,有两种主要的方式来创建线程:继承Thread类和实现Runnable接口。下面我们将详细讨论这两个方法。 1. 继承Thread类: 当一个...