Mac上没有javaw.exe,Activity Monitor中新跑起来的线程名就叫做 java,其中有五六个进程都叫java;
于是我的解决方案就是盯着Activity Monitor,对比程序跑起来之后,选出新加入的PID,暂时解决了这个问题;
但这样太蠢了,有没有更方便的方法呢?
首先我理解的守护线程是“保护线程”
第一守护线程肯定会执行。
第二如果去掉肯定会一直将线程执行完,如中间未执行完中断线程的话应该会造成空数据或是不可打开文件。
个人理解,没有实际代码支撑。
java的多线程编程自己觉得是一种模拟多线程。所有的线程函数都在一个框架下工作,或者说被框架控制。sleep函数本身就是一个计数器,你可以想象成里面添加了一个while循环。在该循环执行时,当前线程休眠,其他线程运行。当循环结束时,当前线程被唤醒,一旦拥有CPU资源便开始运行。
jdk版本要与操作系统版本一致。
CPU是执行指令是分时的,每个线程是一系列指令的集合,所以有几个线程无所谓,具体执行,每个时间片还是一个具体指令
隐藏!纠正一下你的读音。另外 你这种人最烦了,问了问题 不选最佳答案,以后谁还会回你
奥 明白了
是因为线程的执行顺序啊,每次执行都不一定是一样的。至于剩余票的问题,老师有回答啊~o(^_^)o
public void run() { // TODO Auto-generated method stub while(true){ synchronized(lockObj){ if(ticketsNum>0){ ticketsNum--; System.out.println(Thread.currentThread().getName()+"卖出一张票,剩余"+ticketsNum); //Thread.yield(); lockObj.notifyAll(); } } } }
这样改就能按顺序输出了
因为创建线程时 第二个参数 默认是线程名称
键盘输入后 要按Enter键
你这个是把继承当实现接口用了啊,类继承像这样用是看不到与接口的区别的。要想共享资源你把你的变量ticket定义为static 静态常量就行了,我看过别人这么写过
具体的原理可以分析一下么?
Callable与 Future 两功能是Java在后续版本中为了适应多并法才加入的,Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其他线程执行的任务。
Callable的接口定义如下;
public interface Callable<V> {
V call() throws Exception;
}
Callable和Runnable的区别如下:
I Callable定义的方法是call,而Runnable定义的方法是run。
II Callable的call方法可以有返回值,而Runnable的run方法不能有返回值。
III Callable的call方法可抛出异常,而Runnable的run方法不能抛出异常。
Future 介绍
Future表示异步计算的结果,它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。Future的cancel方法可以取消任务的执行,它有一布尔参数,参数为 true 表示立即中断任务的执行,参数为 false 表示允许正在运行的任务运行完成。Future的 get 方法等待计算完成,获取计算结果
因为其实字符串在之前就已经拼接好了,只是当一号线程重新拿到cpu资源时才打印出来
窗口3卖了一张票,剩余票数:2 为什么还能声誉三张票 不是runable接口嘛
这种情况的解决办法应该可以用线程同步解决
public class SoldTicketThread implements Runnable {
private int ticket = 5;
private synchronized void sale() {
if (ticket > 0) {
System.out.println(Thread.currentThread().getName() + "卖出了一张票,剩余"
+ (--ticket) + "张票");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void run() {
while (ticket > 0) {
sale();
// 这里要确保进入卖票环节前就把资源锁住
}
}
public static void main(String[] args) {
SoldTicketThread window = new SoldTicketThread();
Thread wd1 = new Thread(window, "窗口二");
Thread wd2 = new Thread(window, "窗口一");
Thread wd3 = new Thread(window, "窗口三");
wd1.start();
wd2.start();
wd3.start();
}
}
你本身的逻辑就出错了,卖票的操作肯定要在循环体里面,而且要锁定的内容是整个卖票过程的操作。
16年的帖子 19年的回答。。。
是这样的 因为runnable处理同一资源也无法保证 这个资源 从加载 更改 到赋值的原子性
某个线程出现等待被另外线程抢先运行
使用synchronized 对减少票的方法进行同步修饰
os.write(("\r\nword"+count).getBytes());你应该这么写啊,你少写了一对括号
MyThread mt=new MyThread();
Thread td1=new Thread(mt,"售票口1");
Thread td2=new Thread(mt,"售票口2");
Thread td3=new Thread(mt,"售票口3");
说的是火车票,但是要通过实现Runnable接口,这样才能真正意义的使其成为同一资源,如果是继承Thread类,创建三次,就不是同一资源了,变成了15张票,就不算是同一资源了,是各自独立的资源,我是这样理解的