关于Executors的submit方法,以及Callable多线程的一些感想

 

在使用Callable的过程中遇到了一些问题,就是在遍历资源并用多线程运行的时候,分两种情况:

(1)遍历中没有调用Future的get()方法时,main线程是遍历完所有资源,并不理会线程的创建情况,把线程任务都提交给线程池,然后再由线程池去分配线程。

(2)遍历中调用Future的get()方法时,主线程不会提交所有线程,只会一次提交一个线程并运行。

代码如下:

public class CallableTest {
    public static void main(String[] args) {
        int k = 0;
        ExecutorService threadPool = Executors.newFixedThreadPool(10);
        List list = new ArrayList<>();
        for (int i = 100;i >= 0;i--){
            list.add(threadPool.submit(new Sell(i)));
            System.out.println(Thread.currentThread().getName()+k);
            k++;
        }
        for (Future f : list) {
            try{
                if(f.isDone()){
                    System.out.println(f.get());
                }else {
                    System.out.println("线程还没执行完毕");
                }
            }catch (Exception e){
                e.printStackTrace();
            }

        }
    }
}

class Sell implements Callable{
    private int tickets;

    public  Sell(int tickets) {
        this.tickets = tickets;
    }

    public String call(){
        String result = Thread.currentThread().getName()+"卖了一张票,"+"余票"+tickets;
        return result;
    }
}

结果如下:可以看到主线程完全运行完毕了,线程池的线程才开始执行。 可以理解为主线程把一百个任务都提交给线程池,然后由线程池去安排这一百个任务。

main0
main1
main2
main3
main4
main5
main6
main7
main8
main9
main10
main11
main12
main13
main14
main15
main16
main17
main18
main19
main20
main21
main22
main23
main24
main25
main26
main27
main28
main29
main30
main31
main32
main33
main34
main35
main36
main37
main38
main39
main40
main41
main42
main43
main44
main45
main46
main47
main48
main49
main50
main51
main52
main53
main54
main55
main56
main57
main58
main59
main60
main61
main62
main63
main64
main65
main66
main67
main68
main69
main70
main71
main72
main73
main74
main75
main76
main77
main78
main79
main80
main81
main82
main83
main84
main85
main86
main87
main88
main89
main90
main91
main92
main93
main94
main95
main96
main97
main98
main99
main100
pool-1-thread-1卖了一张票,余票100
pool-1-thread-2卖了一张票,余票99
pool-1-thread-3卖了一张票,余票98
pool-1-thread-4卖了一张票,余票97
pool-1-thread-5卖了一张票,余票96
pool-1-thread-6卖了一张票,余票95
pool-1-thread-7卖了一张票,余票94
pool-1-thread-8卖了一张票,余票93
pool-1-thread-9卖了一张票,余票92
pool-1-thread-10卖了一张票,余票91
pool-1-thread-10卖了一张票,余票90
pool-1-thread-1卖了一张票,余票89
pool-1-thread-1卖了一张票,余票88
pool-1-thread-4卖了一张票,余票87
pool-1-thread-5卖了一张票,余票86
pool-1-thread-5卖了一张票,余票85
pool-1-thread-7卖了一张票,余票84
pool-1-thread-7卖了一张票,余票83
pool-1-thread-9卖了一张票,余票82
pool-1-thread-10卖了一张票,余票81
pool-1-thread-2卖了一张票,余票80
pool-1-thread-1卖了一张票,余票79
pool-1-thread-1卖了一张票,余票78
pool-1-thread-4卖了一张票,余票77
pool-1-thread-5卖了一张票,余票76
pool-1-thread-4卖了一张票,余票75
pool-1-thread-4卖了一张票,余票74
pool-1-thread-6卖了一张票,余票73
pool-1-thread-5卖了一张票,余票72
pool-1-thread-6卖了一张票,余票71
pool-1-thread-8卖了一张票,余票70
pool-1-thread-3卖了一张票,余票69
pool-1-thread-3卖了一张票,余票68
pool-1-thread-6卖了一张票,余票67
pool-1-thread-6卖了一张票,余票66
pool-1-thread-7卖了一张票,余票65
pool-1-thread-8卖了一张票,余票64
pool-1-thread-7卖了一张票,余票63
pool-1-thread-4卖了一张票,余票62
pool-1-thread-10卖了一张票,余票61
pool-1-thread-10卖了一张票,余票60
pool-1-thread-2卖了一张票,余票59
pool-1-thread-3卖了一张票,余票58
pool-1-thread-1卖了一张票,余票57
pool-1-thread-5卖了一张票,余票56
pool-1-thread-8卖了一张票,余票55
pool-1-thread-9卖了一张票,余票54
pool-1-thread-7卖了一张票,余票53
pool-1-thread-4卖了一张票,余票52
pool-1-thread-7卖了一张票,余票51
pool-1-thread-7卖了一张票,余票50
pool-1-thread-3卖了一张票,余票49
pool-1-thread-3卖了一张票,余票48
pool-1-thread-6卖了一张票,余票47
pool-1-thread-1卖了一张票,余票46
pool-1-thread-8卖了一张票,余票45
pool-1-thread-9卖了一张票,余票44
pool-1-thread-9卖了一张票,余票43
pool-1-thread-10卖了一张票,余票42
pool-1-thread-2卖了一张票,余票41
pool-1-thread-2卖了一张票,余票40
pool-1-thread-2卖了一张票,余票39
pool-1-thread-3卖了一张票,余票38
pool-1-thread-2卖了一张票,余票37
pool-1-thread-3卖了一张票,余票36
pool-1-thread-1卖了一张票,余票35
pool-1-thread-1卖了一张票,余票34
pool-1-thread-9卖了一张票,余票33
pool-1-thread-4卖了一张票,余票32
pool-1-thread-7卖了一张票,余票31
pool-1-thread-7卖了一张票,余票30
pool-1-thread-6卖了一张票,余票29
pool-1-thread-3卖了一张票,余票28
pool-1-thread-2卖了一张票,余票27
pool-1-thread-1卖了一张票,余票26
pool-1-thread-8卖了一张票,余票25
pool-1-thread-9卖了一张票,余票24
pool-1-thread-10卖了一张票,余票23
pool-1-thread-4卖了一张票,余票22
pool-1-thread-7卖了一张票,余票21
pool-1-thread-5卖了一张票,余票20
pool-1-thread-5卖了一张票,余票19
pool-1-thread-6卖了一张票,余票18
pool-1-thread-2卖了一张票,余票17
pool-1-thread-1卖了一张票,余票16
pool-1-thread-8卖了一张票,余票15
pool-1-thread-9卖了一张票,余票14
pool-1-thread-10卖了一张票,余票13
pool-1-thread-10卖了一张票,余票12
pool-1-thread-7卖了一张票,余票11
pool-1-thread-5卖了一张票,余票10
pool-1-thread-6卖了一张票,余票9
pool-1-thread-3卖了一张票,余票8
pool-1-thread-2卖了一张票,余票7
pool-1-thread-1卖了一张票,余票6
pool-1-thread-8卖了一张票,余票5
pool-1-thread-9卖了一张票,余票4
pool-1-thread-10卖了一张票,余票3
pool-1-thread-4卖了一张票,余票2
pool-1-thread-10卖了一张票,余票1
pool-1-thread-5卖了一张票,余票0

 

 

你可能感兴趣的:(java,ExecutorService,submit,Callable,主线程,线程运行顺序)