`

实现线程3种方式

 
阅读更多

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);
        }
    }

 

 

 

0
0
分享到:
评论

相关推荐

    java多线程每个线程挨着打印ABC的4种实现方式

    java多线程每个线程挨着打印ABC的4种实现...里面一共有4中实现方式,实现线程间同步和通信问题,有synchronized实现也有ReentrantLock的实现,还有不用任何锁和同步的实现。欢迎大家一起交流,使用更多的方法来实现。

    线程间通信方式3:消息传递方式

    本示例“线程间通信方式3:消息传递方式”着重介绍了通过消息传递实现线程间的通信。下面将详细阐述这种通信方式以及相关的技术点。 1. **消息传递**: - 在Windows环境下,消息传递是通过消息队列、消息循环和...

    多线程两种实现方式Java

    `ThreadProject`可能是包含多个Java文件的项目,这些文件展示了如何通过上述两种方式实现多线程。你可以通过运行这些示例来更好地理解和学习Java多线程的概念。例如,它可能包含一个继承`Thread`的类,一个实现`...

    Java有两种实现多线程的方式:通过Runnable接口、通过Thread直接实现,请掌握这两种实现方式,并编写示例程序。

    ### Java中的两种多线程实现方式 在Java中,实现多线程的两种主要方式分别是:**通过继承`Thread`类** 和 **实现`Runnable`接口**。下面将详细介绍这两种方式,并提供相应的示例程序。 #### 一、通过继承`Thread`...

    线程同步的四种方式

    在多线程编程中,线程同步是一种控制多个线程并发执行时访问共享资源的方式,以避免数据不一致和死锁等问题。以下是对线程同步的四种主要方式的详细解释: 1. **事件(Event)** 事件是Windows API提供的一种线程...

    线程的几种控制方式以及线程间的几种通信方式

    3. **生产者-消费者模型**:使用队列实现,生产者线程往队列中添加元素,消费者线程从中取出元素。Java的`BlockingQueue`接口和Python的`queue`模块提供了现成的实现。 4. **管程(Monitor)**:Java中的`...

    java用线程两种方式

    这种方式实现线程较为直观,因为可以直接调用Thread类的方法。例如,在给定的代码示例中,EvenNumber和OddNumber类都继承自Thread类,并且重写了run()方法来打印特定的数字。创建线程时,只需要创建相应的Thread子类...

    四种方式实现线程

    本文将深入探讨四种实现线程的方法:Thread类、Runnable接口、Callable接口以及ExecutorService。每种方法都有其特定的应用场景和优势,下面我们将逐一详细讲解。 1. **Thread类** 当直接继承`java.lang.Thread`类...

    java线程:两种传统的实现方式.zip

    这两种方式都可以实现线程的创建和运行,但实现`Runnable`接口更常见,因为它允许你在不干扰类继承结构的情况下复用已有的类。 在实际应用中,你可能还需要考虑线程同步和通信,比如使用`wait()`, `notify()`或`...

    用VB6实现多线程

    4. **处理线程间通信**:VB6不直接支持线程间通信,但可以通过全局变量、事件或内存映射文件等方式进行。 5. **结束线程**:当线程完成其任务时,调用`ExitThread`,并确保在主线程中关闭线程句柄。 6. **错误处理...

    Qt两种方法实现多线程并安全结束线程及QMutex加锁Qt单例化实现

    - **线程同步**:QMutex是一种互斥锁,用于保护共享资源不被多个线程同时访问。在访问关键区域(可能引发竞争条件的部分)之前,应调用`lock()`,访问结束后调用`unlock()`。 - **加锁技巧**:确保每次`unlock()`...

    实现Runnable接口创建多线程.docx

    在Java编程语言中,创建线程有两种主要方式:继承`Thread`类和实现`Runnable`接口。由于Java的单继承特性,当一个类需要继承其他类时,就不能再直接继承`Thread`,这时实现`Runnable`接口就成为创建线程的优选方案。...

    Java多线程实现的四种方式

    在Java中,实现多线程有四种主要方法:继承Thread类、实现Runnable接口、使用ExecutorService和使用Callable与Future。下面将详细探讨这四种方式。 1. 继承Thread类 在Java中,我们可以直接继承Thread类并重写其run...

    CoProc_MultiThread_autoit3_autoit_多线程_au3多线程_au3_

    在标题和描述中提到的“CoProc_MultiThread_autoit3_autoit_多线程_au3多线程_au3_”主题,重点是使用 AutoIt 3 来实现多线程功能。在AutoIt中,多线程是非常有用的,它允许脚本同时执行多个任务,提高程序的效率和...

    C#跨线程调用控件的四种方式(调用实例源码)

    下面我们将详细介绍C#中实现跨线程调用控件的四种常见方法,并提供相应的调用实例源码。 1. **控件的Invoke方法** 这是最常用且最直接的方法。`Control.Invoke`方法用于在控件所在的线程上执行指定的委托。如果...

    linux上实现多进程和多线程实现同步互斥(源代码)

    - 使用条件变量实现线程间的协作,如生产者消费者模型。 - 实现读写锁,允许多个读取线程并行,写入线程独占。 - 应用信号量控制并发访问的资源数量。 总结,Linux上的多进程和多线程编程涉及复杂的同步互斥操作,...

    VC中利用多线程技术实现线程之间的通信

    综上所述,VC++中实现线程间的通信涉及多种技术和方法,需要根据具体的应用场景选择合适的方式。通过熟练掌握这些技术,开发者可以在多线程程序中实现高效、安全的通信,提升软件的性能和用户体验。在实践中,可以...

    多线程两种方式和区别总结

    本篇文章将深入探讨两种实现多线程的方式:继承`Thread`类和实现`Runnable`接口,并分析它们之间的区别。 首先,让我们了解这两种方式的基本概念: 1. **继承Thread类**:这是创建多线程的直接方式,通过创建一个...

    使用“匿名Runnable”子类的方式实现线程,线程中计算1--500所有数字的累加和.txt

    请使用“匿名Runnable”子类的方式实现线程,线程中计算1--500所有数字的累加和,并打印计算结果

    PB多线程实现

    一种常见的方式是创建一个新的窗口类,该窗口类在不同的线程上运行。通过调用如CreateThread或BeginThread等API函数,可以在新的线程上下文中启动这个窗口类。同时,需要处理线程同步问题,例如使用Mutex、Semaphore...

Global site tag (gtag.js) - Google Analytics