`

java 多线程传参

阅读更多

        详细出处参考:http://www.jb51.net/article/31981.htm

 

        在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别。由于线程的运行和结束是不可预料的,因此,在传递和返回数据时就无法象函数一样通过函数参数和return语句来返回数据
在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果。但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别。由于线程的运行和结束是不可预料的,因此,在传递和返回数据时就无法象函数一样通过函数参数和return语句来返回数据。本文就以上原因介绍了几种用于向线程传递数据的方法,在下一篇文章中将介绍从线程中返回数据的方法。

        欲先取之,必先予之。一般在使用线程时都需要有一些初始化数据,然后线程利用这些数据进行加工处理,并返回结果。在这个过程中最先要做的就是向线程中传递数据。

一、通过构造方法传递数据
        在创建线程时,必须要建立一个Thread类的或其子类的实例。因此,我们不难想到在调用start方法之前通过线程类的构造方法将数据传入线程。并将传入的数据使用类变量保存起来,以便线程使用(其实就是在run方法中使用)。下面的代码演示了如何通过构造方法来传递数据:
        复制代码 代码如下:

package mythread;
public class MyThread1 extends Thread {
	private String name;
	public MyThread1(String name) {
		this.name = name;
	}
	public void run() {
		System.out.println("hello " + name);
	}
	public static void main(String[] args) {
		Thread thread = new MyThread1("world");
		thread.start();
	}
} 

 
        由于这种方法是在创建线程对象的同时传递数据的,因此,在线程运行之前这些数据就就已经到位了,这样就不会造成数据在线程运行后才传入的现象。如果要传递更复杂的数据,可以使用集合、类等数据结构。使用构造方法来传递数据虽然比较安全,但如果要传递的数据比较多时,就会造成很多不便。由于Java没有默认参数,要想实现类似默认参数的效果,就得使用重载,这样不但使构造方法本身过于复杂,又会使构造方法在数量上大增。因此,要想避免这种情况,就得通过类方法或类变量来传递数据。

二、通过变量和方法传递数据
        向对象中传入数据一般有两次机会,第一次机会是在建立对象时通过构造方法将数据传入,另外一次机会就是在类中定义一系列的public的方法或变量(也可称之为字段)。然后在建立完对象后,通过对象实例逐个赋值。下面的代码是对MyThread1类的改版,使用了一个setName方法来设置 name变量:
        复制代码 代码如下:

package mythread;
public class MyThread2 implements Runnable {
	private String name;
	public void setName(String name) {
		this.name = name;
	}
	public void run(){
		System.out.println("hello " + name);
	}
	public static void main(String[] args) {
		MyThread2 myThread = new MyThread2();
		myThread.setName("world");
		Thread thread = new Thread(myThread);
		thread.start();
	}
} 

 
三、通过回调函数传递数据
        上面讨论的两种向线程中传递数据的方法是最常用的。但这两种方法都是main方法中主动将数据传入线程类的。这对于线程来说,是被动接收这些数据的。然而,在有些应用中需要在线程运行的过程中动态地获取数据,如在下面代码的run方法中产生了3个随机数,然后通过Work类的process方法求这三个随机数的和,并通过Data类的value将结果返回。从这个例子可以看出,在返回value之前,必须要得到三个随机数。也就是说,这个 value是无法事先就传入线程类的。
        复制代码 代码如下:

package mythread;
class Data {
	public int value = 0;
}

class Work{
	public void process(Data data, Integer numbers) {
		for (int n : numbers) {
			data.value += n;
		}
	}
}


public class MyThread3 extends Thread {
	private Work work;
	public MyThread3(Work work) {
		this.work = work;
	}
	public void run() {
		java.util.Random random = new java.util.Random();
		Data data = new Data();
		int n1 = random.nextInt(1000);
		int n2 = random.nextInt(2000);
		int n3 = random.nextInt(3000);
		work.process(data, n1, n2, n3); // 使用回调函数
		System.out.println(String.valueOf(n1) + "+" + String.valueOf(n2) + "+" + String.valueOf(n3) + "=" + data.value);
	}
	public static void main(String[] args) {
		Thread thread = new MyThread3(new Work());
		thread.start();
	}
}

 

 

 

 

分享到:
评论

相关推荐

    java向多线程中传递参数的三种方法详细介绍

    以下将详细介绍三种向Java多线程传递参数的方法。 1. **通过构造方法传递数据** 当创建Thread类或其子类的实例时,可以利用构造方法来传递数据。这些数据通常存储为类的成员变量,在`run()`方法中使用。例如: ``...

    Java开启新线程并传参方法代码实现

    * 从多线程共享同一个资源上分析,继承方式不能做到。 实现方式: * 从设计上分析,Java中类可以多实现接口,此时该类还可以继承其他类,并且还可以实现其他接口,设计更为合理。 * 从操作上分析,实现方式稍微...

    Java多线程Callable接口

    在Java SE5中引入的Callable是一种具有类型参数的泛型,它的类型参数表示的是从方法call()中返回的值,并且必须使用ExecutorService.submit()方法调用它。 import java.util.ArrayList; import java.util....

    java线程简单的封装类

    用反射实现了对java线程简单的封装,类似c#线程,使用此封装类勿需再次继承Thread类或实现Runnable接口,直接绑定需要使用线程的方法即可,另支持动态传参,如觉着好用请多多支持作者 QQ 359103820 希望能为使用线程...

    浅析java中Integer传参方式的问题

    3. **使用AtomicInteger**:Java提供的`AtomicInteger`类允许在多线程环境下安全地修改Integer对象的值。 ```java AtomicInteger ai = new AtomicInteger(40); change(ai); ``` 在`change`方法中,我们可以...

    android中js与java间函数相互调用demo,支持中文传参,无乱码

    对于频繁的JavaScript与Java交互,可以考虑使用消息队列或者异步处理机制,以避免阻塞UI线程。此外,`WebView`还提供了`postMessage`和`onMessage` API,这是一种更现代且推荐的通信方式,它可以在多个窗口或iframe...

    Java向Runnable线程传递参数方法实例解析

    Java是一种支持多线程编程的语言,线程是Java程序中最基本的执行单元。在线程编程中,线程之间的数据传递是一种非常常见的需求。在Java中,Runnable接口是实现多线程的关键,通过实现Runnable接口的run()方法,可以...

    java调用json参数的webservice

    Java是一种广泛使用的编程语言,它具有面向对象、跨平台、多线程以及健壮性等特点。Java在企业级应用中尤为流行,尤其是在构建大型的网络应用程序方面。 JSON(JavaScript Object Notation)是一种轻量级的数据交换...

    浅析Java方法传值和传引用问题

    在处理对象时,理解这个差异至关重要,尤其是在处理多线程环境或并发操作时,避免意外的共享状态修改是防止错误的关键。 总的来说,Java的方法参数传递机制对基本类型采用传值,对象类型采用“传引用”的方式。理解...

    java调用第三方的短信接口

    5. **线程安全与异步处理**:为了提高性能,发送短信可能会采用多线程或异步方式。你需要理解Java并发编程的基本概念,如synchronized关键字、Callable和Future接口,或者使用CompletableFuture进行异步操作。 6. *...

    servlet传参

    Servlet 是一个运行在服务器端的单实例多线程的服务器端 Java 应用程序。理解 Servlet 的生命周期和接受参数信息是掌握 Servlet 技术的关键。 Servlet 的生命周期 Servlet 的生命周期可以分为四个阶段: 1. 初始...

    java视频教程_黑马Java零基础辅导班[第二期]08天课件源码

    11. **多线程**:Java内置了对多线程的支持,通过Thread类或实现Runnable接口创建并管理线程,理解同步和互斥的概念,能够编写并发程序。 12. **异常与日志**:在实际开发中,良好的异常处理和日志记录能帮助定位和...

    java定时器timer的使用方法代码示例

    因此,如果在多线程环境中使用Timer,需要确保对它的访问是同步的。此外,Timer的任务调度是基于单线程模型的,这意味着所有的`TimerTask`实例会按照它们被安排的顺序依次执行,即使这些任务是并发调度的。这可能...

    Java单例模式深入理解

    这是Joshua Bloch在《Effective Java》中推荐的单例实现方式,线程安全且防止反射攻击。 ```java public enum Singleton { INSTANCE; public void whateverMethod() { } } ``` 每种实现方式都有其优缺点,应根据...

    \java超强笔记(超级经典)

    java.util.concurrent 包含了常用的多线程工具,是新的多线程工具的主体。 java.util.concurrent.atomic 包含了不用加锁情况下就能改变值的原子变量。 java.util.concurrent.locks 包含锁定的工具。 ...

    深入理解JAVA虚拟机实用技巧案例讲解.ppt

    线程死锁是两个或多个线程互相等待对方释放资源,从而导致它们都无法继续执行。避免死锁的方法包括合理设计同步代码,避免循环等待,以及设置资源占用超时。 ### 五、常用的JVM问题分析命令工具 - **jps**:查看...

    java开发工程师试卷一(~).doc

    Java开发工程师试卷主要涵盖Java语言的基础知识,包括访问权限、抽象方法、标识符规则、流程控制、构造函数、多态性、线程管理、JDBC、MVC设计模式、编程题(如水仙花数、物理问题求解、冒泡排序)、简答题(涉及...

    后端开发-06-线程执行带有参数的任务.ev4.rar

    - **多线程优点**:提高系统资源利用率,提高程序响应速度,实现并发执行,提升整体性能。 2. **线程执行任务** - **创建线程**:在Java等语言中,可以通过继承Thread类或者实现Runnable接口来创建线程。 - **...

    java软件工程师考试笔试题2012

    Java软件工程师笔试题通常涵盖了Java语言的基础语法、面向对象特性、异常处理、数据类型、类与接口、集合框架、多线程、IO流、网络编程等多个方面。以下是一些基于题目内容的知识点详解: 1. **标识符合法性**:在...

Global site tag (gtag.js) - Google Analytics