java多线程-1

1、多线程中,代码的运行结果和执行顺序是无关的。package com.alipay.thread;public class Thread1 extends Thread {@Overridepublic void run() {super.run();System.out.println("MyThread");}public static void main(String[] args) {Thread1 myThread = new Thread1();myThread.start();System.out.println("over");}}运行结果:会看到实际上run方法的执行时间比较晚。2、cpu调用线程是一个随机调用,具有不确定性package com.alipay.thread;public class MyThread extends Thread {@Overridepublic void run() {try {for (int i = 0; i < 10; i++) {int time = (int) (Math.random() * 1000);Thread.sleep(time);System.out.println("run=" + Thread.currentThread().getName());}} catch (InterruptedException e) {e.printStackTrace();}}public static void main(String[] args) {try {MyThread myThread = new MyThread();myThread.setName("mythread");myThread.start();for (int i = 0; i < 10; i++) {int time = (int) (Math.random() * 1000);Thread.sleep(time);System.out.println("main=" + Thread.currentThread().getName());}} catch (InterruptedException e) {e.printStackTrace();}}}运行结果:实际上并不是有序的。代码中的start()方法通知“线程规划器”此线程已经准备就绪,等待调用线程对象的run方法,这个过程实际上是让操作系统安排一个时间来调用线程中的run方法,也就是线程得到运行,启动线程,具有异步执行的效果。如果不是调用start而是run,那就不是异步的而是同步的。这时候不是由“线程规划器”来进行处理,而是有main主线程来调用run方法,也就是必须等到run方法中的代码执行结束才会执行下面的代码。实际上,执行start方法并不代表线程启动的顺序例如:package com.alipay.thread;public class Thread2 extends Thread {private int i;public Thread2(int i) {this.i = i;}@Overridepublic void run() {System.out.println(i);}public static void main(String[] args) {Thread2 t1 = new Thread2(1);Thread2 t2 = new Thread2(2);Thread2 t3 = new Thread2(3);Thread2 t4 = new Thread2(4);Thread2 t5 = new Thread2(5);t1.start();t2.start();t3.start();t4.start();t5.start();}}执行结果:但是看这个代码:package com.alipay.thread;public class Thread2 extends Thread {private int i;public Thread2(int i) {this.i = i;}@Overridepublic void run() {System.out.println(i);}public static void main(String[] args) {Thread2 t1 = new Thread2(1);Thread2 t2 = new Thread2(2);Thread2 t3 = new Thread2(3);Thread2 t4 = new Thread2(4);Thread2 t5 = new Thread2(5); /*t1.start();t2.start();t3.start();t4.start();t5.start();*/t1.run();t2.run();t3.run();t4.run();t5.run();}}执行结果就是:2、 isAlive() 方法判断当前进程是否处于活动状态活动状态指的是线程已经启动且尚未终止。线程处于正在运行或者准备开始运行状态的,就认为线程是存活的。在运行isAlive()方法的时候,如果将线程对象以构造参数的形式传递给Thread对象进行start()启动时,运行的结果是会有差异的,这是由于currentThread和this的差异。package com.alipay.thread;public class Thread6 extends Thread {public Thread6() {System.out.println("coo:" + Thread.currentThread().getName());System.out.println("coothis:" + this.getName());}@Overridepublic void run() {System.out.println("coo1:" + Thread.currentThread().getName());System.out.println("coo1this:" + this.getName());}}package com.alipay.thread;public class Run {public static void main(String[] args) {Thread6 t6 = new Thread6();Thread t = new Thread(t6);t.setName("A");t.start();}}输出结果:造成这样的结果的原因是:currentThread()方法返回的是对当前正在执行的线程对象的引用,this代表的是当前调用它所在函数所属的对象的引用。使用Thread.currentThread().getName()和使用this.getName(),都可以得到线程的名称,但是使用this调用getName()方法只能在本类中,而不能在其他类中,更不能在Runnable接口中,所以只能使用Thread.currentThread().getName()获取线程的名称,否则会出现编译时异常。3、sleep() 方法是让正在执行的线程在指定的毫秒内休眠。正在执行的线程指的是this.currentThread()返回的线程。4、停止线程java中有三种方法可以停止线程:(1)run方法完成后线程正常终结;(2)stop方法终结,使用他们会产生不可预料的结果;(3)使用interrupt方法中断线程,这个方法不会终止一个正在运行的线程,还需要加入一个判断才能执行;使用interrupt()方法停止线程,只是在当前线程中打了一个停止的标记,并不是真的停止线程。判断线程是否是停止状态1)this.interrupt(): 测试当前线程是否已经中断;public static boolean interrupt()2)this.isInterrupted(): 测试线程是否已经中断; public boolean isInterrupted()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值