java多线程yield_Java多线程的操作,比如yield方法

使用Thread(变成卖各自的票)或者是Runnable(只卖10张票)实现线程的共享

一、线程的命名与取得

public class TestThread14 {

public static void main(String[] args) {

MyThread6 mt=new MyThread6();

// 没有设置名字,会自动分配一个线程名字

// 线程名字如果要设置请避免重复,同时中间不要修改

//这俩个执行的时候不按照顺序

new Thread(mt).start();

new Thread(mt).start();

new Thread(mt,"java").start();

//直接调用对象的run方法

mt.run();

}

}

class MyThread6 implements Runnable{

@Override

public void run() {

for(int i=0;i<10;i++){

//取得线程名字

System.out.println("当前线程"+Thread.currentThread().getName()+",i="+i);

}

}

}

二、线程休眠(sleep方法)

程休眠:指的是让线程暂缓执行一下,等到了预计时间之后再恢复执行。线程休眠会交出CPU,让CPU去执行其他的任务。但是有一点要非常注意,sleep方法不会释放锁,也就是说如果当前线程持有对某个对象的锁,则即使调用sleep方法,其他线程也无法访问这个对象

//是依次进入到run()方法中的

//真正进入到方法的对象可能是多个,也可能是一个。进入代码的顺序可能有差异,但是总体执行是并发执行的

public class TestThread15 {

public static void main(String[] args) {

MyThread7 mt = new MyThread7();

new Thread(mt).start();

new Thread(mt).start();

new Thread(mt).start();

}

}

class MyThread7 implements Runnable {

@Override

public void run() {

for (int i = 0; i < 10; i++) {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("当前线程" + Thread.currentThread().getName() + ",i=" + i);

}

}

}

三、线程让步(yield()方法)

//暂停当前正在执行的线程对象,并执行其他线程。

意思就是调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程。它跟sleep方法类似,同样不会释放锁。

但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会。

注意调用yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,这一点是和sleep方法不一样的

public class TestThread16 {

public static void main(String[] args) {

MyThreadTest mt = new MyThreadTest();

new Thread(mt,"1").start();

new Thread(mt,"2").start();

new Thread(mt,"3").start();

}

}

class MyThreadTest implements Runnable {

@Override

public void run() {

for (int i = 0; i < 3; i++) {

Thread.yield();

System.out.println("当前线程:" + Thread.currentThread().getName()+" ,i = "

+i);

}

}

}

四、join方法

等待该线程终止。意思就是如果在主线程中调用该方法时就会让主线程休眠,让调用该方法的线程run方法先执行完毕之后在开始执行主线程

public class TestThread18 {

public static void main(String[] args) throws InterruptedException {

MyThread0 mt = new MyThread0();

Thread thread = new Thread(mt, "子线程A");

thread.start();

System.out.println(Thread.currentThread().getName());

thread.join();

System.out.println("");

}

public static void printTime() {

Date date=new Date();

DateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String time=format.format(date);

System.out.println(time);

}

}

class MyThread0 implements Runnable {

@Override

public void run() {

try {

System.out.println("主线程睡眠前的时间");

TestThread18.printTime();

Thread.sleep(2000);

System.out.println(Thread.currentThread().getName());

System.out.println("睡眠结束的时间");

TestThread18.printTime();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

结果

main

主线程睡眠前的时间

2019-03-01 18:28:20

子线程A

睡眠结束的时间

2019-03-01 18:28:22

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值