设为首页 加入收藏

TOP

Java带参数的线程类ParameterizedThread(一)
2018-07-13 06:07:06 】 浏览:172
Tags:Java 参数 线程 ParameterizedThread

    在Java中似乎没有提供带运行参数的线程实现类,在第三方类库中也没有找到。如果读者知道有官方或者第三方的实现方式,请留言。本文给出了一种实现带运行参数的线程实现类。


    让我们先看一段代码,请问这段代码存在什么问题?


for (int i = 0; i < 100; i++) {
    Thread th = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println(i + "");
        }
    });
    th.start();
}


  (1)首先这段程序是无法通过编译的,在intellij idea中提示“Variable  ‘i’ is accessed from within inner class,needs to be final or effectively final”,在Eclipse中提示"Local variable i defined in an enclosing scope must be final or effectively final",意思是说在内部类中无法访问变化的成员变量。那么我们很容易想通过下面的方式解决:


for (int i = 0; i < 100; i++) {
    int p = i;
    Thread th = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println(p + "");
        }
    });
    th.start();
}


    这段代码能够通过编译,而且似乎运行良好。但是不是线程安全的,父线程中的循环变量不断被修改,子线程得到的父线程成员变量可能是不正确的。


(2)其次上面的代码在循环体内创建了大量的子线程,线程的创建和销毁会造成系统资源的开销,一般推荐使用线程池的方式创建线程,比如ThreadPoolExecutor。


ThreadPoolExecutor executor = new ThreadPoolExecutor(6, 10, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
       
for (int i = 0; i < 100; i++) {
    int p=i;
    executor.execute(()->{
        System.out.println(p + "");
    });
}


    那么有什么办法使得子线程能够安全的获取到父线程的变量呢,我们可以编写如下的线程实现类:


public class MyRunnable implements Runnable {


    Object param;


    public MyRunnable(Object parameter) {
        this.param = parameter;
    }


    @Override
    public void run() {
        System.out.println(param.toString());
    }
}


    这里的问题是我们必须针对不同的情形,编写不同的子线程实现类。在C#中,微软提供了许多带参数的线程创建方法,但是在Java中没有找到类似的带参数的线程实现类。如下是C#提供的带参数的子线程创建方法:


Thread th = new Thread((param) =>
{
    Console.WriteLine(param);
});
th.Start(i);


Task.Factory.StartNew((param) =>
{
    Console.WriteLine(param);
}, i);


ThreadPool.QueueUserWorkItem((param) =>
 {
    Console.WriteLine(param);
}, i);


    为了解决这个问题,笔者用Java封装了一个带参数的线程类:


/**
 * ParameterizedThreadStart defines the start method for starting a thread.
 * @author wadexmy
 * @param <T>
 */
public interface ParameterizedThreadStart<T>{
    /**
    * a method with parameter
    * @param context
    */
    void run(T context);
}


 


/**
 * ParameterizedThread defines a thread with a generic parameter
 * @author wadexmy
 * @param <T>
 */
public class ParameterizedThread<T> implements Runnable{


    private T context;
    private ParameterizedThreadStart<T> parameterStart;


    /**
    * Constructor
    * @param context
    */
    public ParameterizedThread(T context,ParameterizedThreadStart<T> parameterStart){
        this.context=context;
        this.parameterStart=paramet

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Python3 中 and 和 or 运算规律 下一篇SpringBoot中Async异步方法和定时..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目