永发信息网

Java里的线程问题

答案:3  悬赏:40  手机版
解决时间 2021-03-20 19:44
  • 提问者网友:贪了杯
  • 2021-03-19 23:00
package cn.bjsxt.Thread;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TestSleep {
public static void main(String[] args) {
MyThread mt = new MyThread();
mt.start();
try {
Thread.sleep(10000);
}catch(Exception e) {
e.printStackTrace();
}
mt.interrupt();
}
}

class MyThread extends Thread {
public void run() {
while(true) {
DateFormat df = new SimpleDateFormat("yyyy年MM月dd日h点mm分ss秒");
String s = df.format(new Date());
System.out.println("=====" + s + "=====");
try{
sleep(1000);
}catch(Exception e) {
return;
}
}
}
}
当主线程sleep10s之后,主线程这时候应该进入了就绪状态,并不一定sleep10s结束之后,这个mt,interrupt方法就立刻执行才对。那么也就是说,在这个主线程sleep10S的过程中,必然是MyThread一直在执行,也就是输出10个时间,但是为什么每次一到10S,MyThread线程就会立即终止,按道理说就算MainThread sleep10S之后,也不是立即切换到MainThread,MyThread还是有被执行的几率才对的啊?
最佳答案
  • 五星知识达人网友:轮獄道
  • 2019-04-20 23:20
1、线程调度,若不设置优先级的话,由CPU随机调度。若是设置了优秀级,也不能保证优秀级高的就一定先执行,只能保证在一定范围内它的执行时间片要长。
2、这个主要是Thread.sleep有关,因为它已sleep10s,已经有很长没得到执行CPU的时间片,它一旦sleep完,是会优先被执行的,这是符合CPU时间片的轮询策略的。
再如yield方法也是如此,一般当yield之后,会马上得到执行时间片。
再考虑下吧。
全部回答
  • 1楼网友:白昼之月
  • 2020-01-17 20:02
其实就一句话:只要是有多个线程访问并修改某个变量或是区域的话,一定要加上同步设置(比如同步控制语句,互斥锁,信号量,原子操作等等)。 b/s结构中,如果你不编写类似apache等的http server,那么你不用考虑线程安全这个问题。 如果有多个用户访问数据库的情况出现: 1.若数据库中间件封装了同步功能,则不需要考虑线程安全; 2.若数据库本身支持并发操作,则不需要考虑线程安全; 3.否则则需要考虑线程安全的问题。
  • 2楼网友:孤老序
  • 2021-02-14 03:13
这个很容易理解,你这样分析是很正确的,但是问题是现在的CPU是什么CPU,就两行代码,你意味一个时间片执行没有完成?我不知道一个时间片到底可以执行多少行代码,但是区区两行并不算什么,所以一般休眠结束之后就立刻调用 mt.interrupt();,这时候就要看子线程是什么状态了,如果是在sleep中就立刻终止运行
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯