1、继承Thread实现。
2、实现Runnable接口。
3、实现Callable接口,用FutureTask接收返回值。
总结:其实线程最核心的是Runnable,因为Thread和FutureTask都继承该接口来实现具体功能,即拓展实现。而Thread实现的start0()方法,其调用本地方法开启新线程。
看第三种:
1)其中FutureTask继承了Runnable接口,所以可以当做一个线程来处理,并得到返回值。
2)future.get()的方法实现由必要看一下,当线程未执行或未结束时,会阻塞当前线程,直到该线程执行完毕。
3)为什么可以获得返回值呢?看下future.run()就懂了,对Runnable的run()包装了一层,调用继承Callable的方法获得返回值保存给当前future,详见代码2。
代码1(测试代码):
public static void main(String[] args) throws FileNotFoundException, InterruptedException, ExecutionException { FutureTask<Integer> future=new FutureTask<Integer>(new Callable<Integer>() { @Override public Integer call() throws Exception { Thread.sleep(2000); return 182; } }); System.out.println(future.isDone()); new MyThread(future).start(); new Thread(future).start(); System.out.println(future.get()); } static class MyThread extends Thread{ FutureTask<Integer> future; private MyThread(FutureTask<Integer> future) { this.future = future; } @Override public void run() { try { System.out.println("获取到了"+this.future.get()); } catch (Exception e) { e.printStackTrace(); } } }
输出:
false 获取到了182 182
代码2(FutureTask实现方法):
public void run() { if (state != NEW || !UNSAFE.compareAndSwapObject(this, runnerOffset, null, Thread.currentThread())) return; try { Callable<V> c = callable; if (c != null && state == NEW) { V result; boolean ran; try { result = c.call(); ran = true; } catch (Throwable ex) { result = null; ran = false; setException(ex); } if (ran) set(result); } } finally { // runner must be non-null until state is settled to // prevent concurrent calls to run() runner = null; // state must be re-read after nulling runner to prevent // leaked interrupts int s = state; if (s >= INTERRUPTING) handlePossibleCancellationInterrupt(s); } }
相关推荐
java多线程每个线程挨着打印ABC的4种实现...里面一共有4中实现方式,实现线程间同步和通信问题,有synchronized实现也有ReentrantLock的实现,还有不用任何锁和同步的实现。欢迎大家一起交流,使用更多的方法来实现。
本示例“线程间通信方式3:消息传递方式”着重介绍了通过消息传递实现线程间的通信。下面将详细阐述这种通信方式以及相关的技术点。 1. **消息传递**: - 在Windows环境下,消息传递是通过消息队列、消息循环和...
`ThreadProject`可能是包含多个Java文件的项目,这些文件展示了如何通过上述两种方式实现多线程。你可以通过运行这些示例来更好地理解和学习Java多线程的概念。例如,它可能包含一个继承`Thread`的类,一个实现`...
### Java中的两种多线程实现方式 在Java中,实现多线程的两种主要方式分别是:**通过继承`Thread`类** 和 **实现`Runnable`接口**。下面将详细介绍这两种方式,并提供相应的示例程序。 #### 一、通过继承`Thread`...
在多线程编程中,线程同步是一种控制多个线程并发执行时访问共享资源的方式,以避免数据不一致和死锁等问题。以下是对线程同步的四种主要方式的详细解释: 1. **事件(Event)** 事件是Windows API提供的一种线程...
3. **生产者-消费者模型**:使用队列实现,生产者线程往队列中添加元素,消费者线程从中取出元素。Java的`BlockingQueue`接口和Python的`queue`模块提供了现成的实现。 4. **管程(Monitor)**:Java中的`...
这种方式实现线程较为直观,因为可以直接调用Thread类的方法。例如,在给定的代码示例中,EvenNumber和OddNumber类都继承自Thread类,并且重写了run()方法来打印特定的数字。创建线程时,只需要创建相应的Thread子类...
本文将深入探讨四种实现线程的方法:Thread类、Runnable接口、Callable接口以及ExecutorService。每种方法都有其特定的应用场景和优势,下面我们将逐一详细讲解。 1. **Thread类** 当直接继承`java.lang.Thread`类...
这两种方式都可以实现线程的创建和运行,但实现`Runnable`接口更常见,因为它允许你在不干扰类继承结构的情况下复用已有的类。 在实际应用中,你可能还需要考虑线程同步和通信,比如使用`wait()`, `notify()`或`...
4. **处理线程间通信**:VB6不直接支持线程间通信,但可以通过全局变量、事件或内存映射文件等方式进行。 5. **结束线程**:当线程完成其任务时,调用`ExitThread`,并确保在主线程中关闭线程句柄。 6. **错误处理...
- **线程同步**:QMutex是一种互斥锁,用于保护共享资源不被多个线程同时访问。在访问关键区域(可能引发竞争条件的部分)之前,应调用`lock()`,访问结束后调用`unlock()`。 - **加锁技巧**:确保每次`unlock()`...
在Java编程语言中,创建线程有两种主要方式:继承`Thread`类和实现`Runnable`接口。由于Java的单继承特性,当一个类需要继承其他类时,就不能再直接继承`Thread`,这时实现`Runnable`接口就成为创建线程的优选方案。...
在Java中,实现多线程有四种主要方法:继承Thread类、实现Runnable接口、使用ExecutorService和使用Callable与Future。下面将详细探讨这四种方式。 1. 继承Thread类 在Java中,我们可以直接继承Thread类并重写其run...
在标题和描述中提到的“CoProc_MultiThread_autoit3_autoit_多线程_au3多线程_au3_”主题,重点是使用 AutoIt 3 来实现多线程功能。在AutoIt中,多线程是非常有用的,它允许脚本同时执行多个任务,提高程序的效率和...
下面我们将详细介绍C#中实现跨线程调用控件的四种常见方法,并提供相应的调用实例源码。 1. **控件的Invoke方法** 这是最常用且最直接的方法。`Control.Invoke`方法用于在控件所在的线程上执行指定的委托。如果...
- 使用条件变量实现线程间的协作,如生产者消费者模型。 - 实现读写锁,允许多个读取线程并行,写入线程独占。 - 应用信号量控制并发访问的资源数量。 总结,Linux上的多进程和多线程编程涉及复杂的同步互斥操作,...
综上所述,VC++中实现线程间的通信涉及多种技术和方法,需要根据具体的应用场景选择合适的方式。通过熟练掌握这些技术,开发者可以在多线程程序中实现高效、安全的通信,提升软件的性能和用户体验。在实践中,可以...
本篇文章将深入探讨两种实现多线程的方式:继承`Thread`类和实现`Runnable`接口,并分析它们之间的区别。 首先,让我们了解这两种方式的基本概念: 1. **继承Thread类**:这是创建多线程的直接方式,通过创建一个...
请使用“匿名Runnable”子类的方式实现线程,线程中计算1--500所有数字的累加和,并打印计算结果
一种常见的方式是创建一个新的窗口类,该窗口类在不同的线程上运行。通过调用如CreateThread或BeginThread等API函数,可以在新的线程上下文中启动这个窗口类。同时,需要处理线程同步问题,例如使用Mutex、Semaphore...