Java中的dllmain 中创建线程线程是不是最后一个退出的线程

2140人阅读
Android 基础教程(40)
如题,有时候我们需要在Main函数中写测试代码,并且需要在异步线程中执行任务,任务执行完之后才退出主线程,如何做到的呢,请看如下代码:
public class TestMain {
* @param args
public static void main(String[] args) {
System.out.println(&-------work------start---------&);
LockHandler mHandler=new LockHandler();
Thread mThread=new Thread(new WorkRunnable(mHandler));
mThread.setDaemon(true);
mThread.start();
mHandler.waitForDebug();
System.out.println(&-------work------end---------&);
public static class WorkRunnable implements Runnable
public LockHandler mH
public WorkRunnable(LockHandler mHandler)
this.mHandler = mH
public void run() {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println(&-------我在异步线程中睡了五秒---------&);
mHandler.notifytForDebug();
public static class LockHandler
public synchronized void waitForDebug()
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
public synchronized void notifytForDebug()
this.notifyAll();
执行结果:
-------work------start---------
-------我在异步线程中睡了五秒---------
-------work------end---------
只需要重写WorkRunnable类的run()方法,so easy !&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:163561次
积分:2519
积分:2519
排名:第14116名
原创:84篇
转载:26篇
评论:51条
(1)(2)(2)(3)(4)(1)(7)(1)(1)(9)(13)(7)(1)(2)(1)(2)(3)(2)(2)(3)(6)(11)(4)(6)(5)(8)(3)15:25 提问
Java中同步线程不是应该先中断先继续吗,为什么我的没有?求大神指点
代码如下:
public class BuyTicketMain {
public static void main(String args[ ]) {
TicketHouse officer = new TicketHouse();
Thread zhangfei,likui,
zhangfei = new Thread(officer);
zhangfei.setName("张飞");
likui = new Thread(officer);
likui.setName("李逵");
wangwu =new Thread(officer);
wangwu.setName("王五");
wangwu.start();
zhangfei.start();
likui.start();
代码2:import java.util.S
public class TicketHouse implements Runnable {
int fiveAmount=2,tenAmount=0,twentyAmount=0,n=0;
public synchronized void run() {
/* if(Thread.currentThread().getName().equals("张飞")) {
saleTicket(20);
else if(Thread.currentThread().getName().equals("李逵")) {
saleTicket(5);
System.out.println(Thread.currentThread().getName()+"买票"+Thread.currentThread().getName()+"有多少钱?(输入金额,只能为5,20)");
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
saleTicket(n);
private synchronized void saleTicket(int money) {
if(money==5) {
//如果使用该方法的线程传递的参数是5,就不用等待
fiveAmount=fiveAmount+1;
System.out.println( "给"+Thread.currentThread().getName()+"入场卷,"+
Thread.currentThread().getName()+"的钱正好");
else if(money==20) {
while(fiveAmount&3) {
try { System.out.println("\n"+Thread.currentThread().getName()+"靠边等...");
//如果使用该方法的线程传递的参数是20须等待
//Thread.sleep(1000);
System.out.println("\n"+Thread.currentThread().getName()+"继续买票");
catch(InterruptedException e){}
fiveAmount=fiveAmount-3;
twentyAmount=twentyAmount+1;
System.out.println("给"+Thread.currentThread().getName()+"入场卷,"+
Thread.currentThread().getName()+"给20,找赎15元");
notifyAll();
下图中张飞不应该在王五之后就可以买票吗?为什么要等李逵买了之后才能继续买票?求大神指点
按赞数排序
可能是线程优先级问题,王五线程启动后占据锁后,李逵线程可能先于张飞线程先执行了。多线程环境下线程的执行顺序可能跟代码中开启的顺序不一致。你可以打印下每个线程的执行时间看看。
亲,这个和释放线程锁有关,当synchronized 中有操作在进行的时候,其他线程是休眠状态,当当synchronized中没有进行操作的时候,休眠状态的线程
被激活,这里面线程的激活有好几种方法,他们之间有些差别,例如: 同时激活又有休眠的线程,让线程自由竞争,谁抢到了谁就有使用权,有的是按顺序激活,
你可以点进去看看底层代码,或者上网查一下,激活线程的几种方式。
测试了下你的代码,的确如此,分析原因如下:
第一个输入20的值的线程被挂起了,即张飞线程被挂起了,但是wait操作时会释放this锁,然后王五和张飞线程运行时,王五和李逵竞争this锁时,王五先获取this锁,然后李逵进入锁等待排队队列中。
王五线程运行完成时会唤醒了张飞,并释放了this锁,张飞线程从挂起状态转换为可运行状态的时间里,李逵先一步获取this锁,并完成执行。所以张飞成了最后一个完成的线程。
主要原因就是线程的状态转换的耗时,导致锁竞争处于劣势。所以这个程序中输入20而挂起的线程总是最后一个完成的。
其他相似问题主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
傻丫头和高科技产物小心翼翼的初恋
如今的编程是一场程序员和上帝的竞赛,程序员要开发出更大更好、傻瓜都会用到软件。而上帝在努力创造出更大更傻的傻瓜。目前为止,上帝是赢的。个人网站:。个人QQ群:、
个人大数据技术博客:
人生得意须尽欢,莫使金樽空对月。
Thread.stop, Thread.suspend, Thread.resume 和Runtime.runFinalizersOnExit 这些终止线程运行的方法已经被废弃,使用它们是极端不安全的!1.线程正常执行完毕,正常结束也就是让run方法执行完毕,该线程就会正常结束。但有时候线程是永远无法结束的,比如while(true)。2.监视某些条件,结束线程的不间断运行需要while()循环在某以特定条件下退出,最直接的办法就是设一个boolean标志,并通过设置这个标志来控制循环是否退出。public class ThreadFlag extends Thread {
public volatile boolean exit = false;
public void run() {
while (!exit) {
System.out.println("running!");
public static void main(String[] args) throws Exception {
ThreadFlag thread = new ThreadFlag();
thread.start();
sleep(1147);
thread.exit = true;
thread.join();
System.out.println("线程退出!");
}3.使用interrupt方法终止线程如果线程是阻塞的,则不能使用方法2来终止线程。public class ThreadInterrupt extends Thread {
public void run() {
sleep(50000);
} catch (InterruptedException e) {
System.out.println(e.getMessage());
public static void main(String[] args) throws Exception {
Thread thread = new ThreadInterrupt();
thread.start();
System.out.println("在50秒之内按任意键中断线程!");
System.in.read();
thread.interrupt();
thread.join();
System.out.println("线程已经退出!");
}学习Java的同学注意了!!!
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码: 我们一起学Java!}

我要回帖

更多关于 main线程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信