为了账号安全,请及时绑定邮箱和手机立即绑定

sleep的问题

http://img1.sycdn.imooc.com//59c0d5cc0001497504000179.jpg

军队作战到什么时候才会进行下一步Thread.sleep(50)呢

正在回答

5 回答

同问?

0 回复 有任何疑惑可以回复我~

了解了线程,可以去了解下 队列, 对于处理高并发,和提高业务数据吞吐量会很有用。

0 回复 有任何疑惑可以回复我~
package com.junbao.thread;

import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadTest {
	
	static  ExecutorService  executorService  =  Executors . newFixedThreadPool (5) ;

	@SuppressWarnings("deprecation")
	public static void main(String[] args) throws InterruptedException {

		ThreadTest test = new ThreadTest();

		List<Integer> numList = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++) {
			numList.add(i);
		}

		// 队列
		 final BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(numList.size());
		// 放入
		try {
			for (Integer ints : numList) {
				queue.put(ints);
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		final List<Integer> outList = new ArrayList<Integer>();

		for (int j = 0; j < 5; j++) {
			new Thread() {
				public void run() {
					while (true) {
						try {
							// 将此处的睡眠时间分别改为100和1000,观察运行结果
							Thread.sleep((int) (Math.random() * (1000 - 100) + 100));
							String name1 = Thread.currentThread().getName();
							System.out.println(name1 + "准备取数据!");
							Integer num = queue.take();// 如果没有了数据,就会阻塞
							String name2 = Thread.currentThread().getName();
							outList.add(num);
							System.out.println(name2 + "已经取走数据," + "队列目前有" + queue.size() + "个数据");
						} catch (InterruptedException e) {
							e.printStackTrace();
						} catch (NoSuchElementException e1) {
							// TODO: handle exception
						}
					}
				}
			}.start();
		}

		try {
			while (true) {
				if (queue.isEmpty()) {
					System.out.println("空了,可以执行其他的任务了:打印输出转以后的列表");
					test.showList(outList);
					System.out.println(Thread.currentThread().getState());
					break;
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		test();
	}

	public void showList(List<Integer> list) {
		System.out.println(list.toString());
	}
	
	public static void test(){
		System.out.println("继续往下执行,看看还有什么可以做");
	}
	
}


0 回复 有任何疑惑可以回复我~

谁说一定要结束才会执行sleep,不是说你能很准确知道作战到什么时候会进行下一步,两个线程运行是状态是交互的,然后你还有个stage线程,三个线程都是独立的。你这两个运行会,他还是会运行stage线程里的sleep方法的。

0 回复 有任何疑惑可以回复我~

我觉得应该是上面两个线程都结束了,才继续进行下面的sleep,你可以将50设置的大一点,比如好几毫秒,然后你可以看一下运行结果。

0 回复 有任何疑惑可以回复我~
#1

16k闪存大脑3954634 提问者

上面两个线程是while(true)的死循环呀,怎么执行的完
2017-09-19 回复 有任何疑惑可以回复我~
#2

慕瓜3258604

111
2018-03-02 回复 有任何疑惑可以回复我~
#3

慕瓜3258604 回复 慕瓜3258604

111111
2018-03-02 回复 有任何疑惑可以回复我~
#4

慕瓜3258604 回复 慕瓜3258604

222
2018-03-02 回复 有任何疑惑可以回复我~
查看1条回复

举报

0/150
提交
取消
深入浅出Java多线程
  • 参与学习       186088    人
  • 解答问题       464    个

带你一起深入浅出多线程,掌握基础,展望进阶路线

进入课程

sleep的问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信