高分悬赏:Java语言编写一个多线程的例子程序给我,要完整,要求如下:

高分悬赏:Java语言编写一个多线程的例子程序给我,要完整,要求如下:
(1)分为10个以上的不同的线程,每个做不同的事情
(2)每个线程执行的时间超过10秒钟
(3)主程序触发所有的线程同时执行
(4)线程执行不能卡,需要回报其中的结果到主程序。

http://www.mamicode.com/info-detail-50277.html 的代码粘贴上去
这篇文章讲解的很详细。

Test类

public static void main(String[] args) throws ExecutionException, InterruptedException {
        exeThread(new Thread1(), new Thread2(), new Thread3());
    }

    private static void exeThread(Callable... threads) throws InterruptedException, ExecutionException {
        List<FutureTask> list = new ArrayList<>();
        for (Callable c: threads) {
            FutureTask<String> task = new FutureTask<String>(c);
            new Thread(task).start();
            list.add(task);
        }
        System.out.println("执行中。。。。。。。");
        for (FutureTask item: list) {
            System.out.println("task return:" + item.get());
        }
    }

thread类

package thread;

import org.omg.Messaging.SyncScopeHelper;

import java.util.concurrent.Callable;

public class Thread1 implements Callable<String>{
    @Override
    public String call() throws Exception {
        System.out.println("threa1正在执行。。。。。。。。。。");
        Thread.sleep(5000);
        return "thread1执行完毕";
    }
}

package thread;

import java.util.concurrent.Callable;

public class Thread2 implements Callable<String>{
    @Override
    public String call() throws Exception {
        System.out.println("threa2正在执行。。。。。。。。。。");
        Thread.sleep(5000);
        return "thread2执行完毕";
    }
}

package thread;

import java.util.concurrent.Callable;

public class Thread3 implements Callable<String>{
    @Override
    public String call() throws Exception {
        System.out.println("threa3正在执行。。。。。。。。。。");
        Thread.sleep(5000);
        return "thread3执行完毕";
    }
}

get方法为阻塞方法,运行这个方法时会等待这个线程执行完毕

我写的是 :主线程 产生10个子线程 分别去读不同的文件内容,子线程读完文件之后 把结果返回给主线程

下面的是主线程TestMain.java 我使用的是测试Junit

package com.ccg.test;

import org.junit.Test;

public class TestMain {

    @Test
    public  void TestMain() throws InterruptedException{
        String f1 = "E:\\txt\\A.txt";
        for(int i=0;i<10;i++)
        {
            System.out.println(f1.replace('A', String.valueOf(i).charAt(0)).toString());
            new Thread(new CallbackThread(new TestMain(), f1.replace('A', String.valueOf(i).charAt(0)),i)).start();
        } 
    }

    public void receiveFileStr(String fileName,String readStr){
        StringBuffer sb = new StringBuffer();
        sb.append(fileName + ":" + readStr);
        System.out.println(sb.toString());
    }
}

下面的是子线程代码:CallbackThread.java

package com.ccg.test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class CallbackThread implements Runnable{

    private String fileName;
    private TestMain callBack;
    private long millis;

    public CallbackThread(TestMain callBack,String fileName,long millis) {
        this.fileName = fileName;
        this.callBack = callBack;
        this.millis=millis;
    }

    @Override
    public void run() {
        try {
            File file = new File(fileName);
            InputStreamReader in = new InputStreamReader(new FileInputStream(file),"gbk");
            BufferedReader br = new BufferedReader(in);
            String str = br.readLine();
            //通知线程调用者run方法执行结果
            callBack.receiveFileStr(fileName,str);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}