java线程返回值讨论 在线程当中,返回值是个很大的问题。比如:在线程执行到某一步的时候要将数据返回,在程序执行完成后要返回值。 在java中,线程的返回值可以使用Future<T>来获取,也可以使用其他的手段。以下讨论一些返回值的一些小手段: 1、使用静态变量来进行值的返回 使用静态变量来进行值的返回是最简单的一种,也是不可取的一种,这种不仅带来线程的安全性,同时内存一直不能释放,直到系统退出才能释放内存,因此会造成内存花费很多,但是真正在使用的很少。 2、使用Futuren<T>来获取 这个不用过多的解释,查看java线程 3、使用反向调用 使用反向调用的就是将当前的对象或者是某个类的实例传入到线程当中,当需要调用时就进行调用。如下图:
代码:
//调用的类 package cn.com.theadmain; public class TestThread { private String testName; public void setTestName(String name) { System.out.println(name); testName = name; } public void testThread() throws InterruptedException { Thread t = new Thread(new ThreadRunnable(this)); t.start(); t.join(); System.out.println(testName); } }
//实现线程执行的代码 package cn.com.theadmain; public class ThreadRunnable implements Runnable { private TestThread testThread; public ThreadRunnable(TestThread testThread) { // TODO Auto-generated constructor stub this.testThread = testThread; } @Override public void run() { // TODO Auto-generated method stub //操作 testThread.setTestName(this.toString()); //操作 } }
在上面的代码中,如果成员变量只是提供一个线程进行修改,其他线程只是读取的话,那么没有必要考虑线程安全的问题,如果是多个线程都要对变量进行修改的话,那么需要考虑到线程安全的问题了。解决线程安全的问题则有两个方法: 1、在成员变量的前面,在private等的后面添加volatile,就可以解决该变量只有一个线程进行访问了。 2、在调用的方法上面添加synchronized修饰关键字,保证只有一个变量访问这个方法 3、在调用的方法中,在关键的代码段添加synchronized(成员变量) 就可以保证关键的代码只有一个线程进行访问了。 4、使用原子类型的变量,比如AtomicInteger,AtomicIntegerArray,使用线程安全的容器,比如ConcurrentHashMap,ConcurrentLinkedQueue, 等。其余的操作在线程结束时操作。