24.线程常用方法

1.休眠

Thread.sleep(3000);//线程休眠3秒

使得当前正在执行的线程休眠一段时间,释放时间片,导致线程进入阻塞状态
sleep(3000),3000的单位是毫秒,设置了sleep就相当于将当前线程挂起5s,这个操作跟线程的优先级无关,当对应的时间到了之后,还会再继续执行


2.合并线程

public class Demo3 {

	public static void main(String[] args) {
		for(int i=0; i<100; i++){
			System.out.println(Thread.currentThread().getName()+":"+i);
			//当i=20 合并线程
			if(i==20){
				//创建合并过来的线程
				CustomThread t=new CustomThread("合并的线程");
				t.start();
				
				try {
					//合并线程
					t.join();
					//合并过来的线程,执行结束后,主线程才会继续执行
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

在执行原来线程的过程中,如果遇到了合并线程,则优先执行合并进来的线程,执行完合并进来的线程后,再回到原来的任务中,继续执行原来的线程

特点

  • 1)线程合并,当前线程一定会释放cpu时间片,cpu会将时间片分给要Join的线程
  • 2)哪个线程需要合并就在当前线程中,添加要合并的线程
  • 3)join之前,一定要将线程处于准备状态start

3.设置线程优先级

可以通过设置优先级来改变线程抢到时间片的概率,优先级高的线程获得较多的执行机会

1)默认情况下,每个线程的优先级都与创建它的父线程具有相同的优先级,例如:main线程具有普通优先级,则由main线程创建的子线程也有相同的普通优先级
2)所传的参数范围1~10,默认为5,对应的数值越大,说明优先级越高,这个方法的设置一定要在start之前
线程的优先级低并不意味着争抢不到时间片,只是抢到时间片的概率比较低而已


4.后台线程


public class Demo4 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//后台线程
		DaemonThread dt=new DaemonThread();
		//设置为后台线程
		dt.setDaemon(true);
		//一定在start之前设置
		dt.start();
		//主线程任务
		for(int i=0; i<100; i++){
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}
}

隐藏起来一直在默默运行的线程,直到进程结束,又被称为守护线程或精灵线程JVM的垃圾回收线程就是典型的后台线程

特征:如果所有的前台线程都死亡,后台线程会自动死亡,必须要在start之前执行


5.线程让步

public class YieldThread extends Thread {
	public YieldThread(){
		
	}
	public YieldThread(String name){
		super(name);
	}
	public void run(){
		for(int i=0; i<50; i++){
			System.out.println(Thread.currentThread().getName()+":"+i);
			//当i=20时 线程让步
			if(i==20){
				System.out.println(Thread.currentThread().getName()+"开始让步");
				Thread.yield();
			}
		}
	}
}

主类:


public class Demo5 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//线程让步
		YieldThread t0=new YieldThread("线程0");
		t0.start();
		YieldThread t1=new YieldThread("线程1");
		t1.start();
	}
}

  • 可以让当前正在执行的线程暂停,但它不会阻塞该线程他只是将该线程转入就绪状态,完全可能出现的情况是:当某个线程调用了yield方法暂停之后,线程调度器又将其调度出来重新执行

  • 实际上,当某个线程调用了yield方法暂停之后,只有优先级与当前线程相同,或者优先级比当前线程更高的就绪状态的线程才会获得执行的机会


处于Running状态的线程,如何进入到阻塞Blocked状态?
1、sleep(睡眠时间,毫秒为单位) 睡眠时间结束后,自动进入到Runnable可运行状态
2、join() 当前线程停止,执行合并过来的线程,当合并过来的线程执行结束后,继续执行之前的线程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中多线程常用方法有以下几种: 1. 继承Thread类:创建一个继承自Thread类的子类,并重写run()方法,在run()方法中定义线程要执行的任务。然后通过创建子类的对象,调用start()方法启动线程。 2. 实现Runnable接口:创建一个实现了Runnable接口的类,并实现其run()方法,在run()方法中定义线程要执行的任务。然后通过创建该类的对象,将其作为参数传递给Thread类的构造方法,再调用start()方法启动线程。 3. 使用Callable和Future:Callable接口是一种带有返回值的线程,通过实现Callable接口并实现其call()方法来定义线程要执行的任务。然后使用ExecutorService的submit()方法提交Callable任务,并返回一个Future对象,通过Future对象可以获取线程执行的结果。 4. 使用线程池:通过Executor框架提供的线程池来管理线程的创建和执行。可以使用Executors类提供的静态方法创建不同类型的线程池,然后将任务提交给线程池执行。 5. 使用synchronized关键字:通过在方法或代码块前加上synchronized关键字来实现线程同步,保证多个线程对共享资源的访问是互斥的。 6. 使用Lock接口:Lock接口提供了比synchronized更灵活和强大的线程同步机制。通过Lock接口的lock()和unlock()方法来实现对共享资源的加锁和解锁。 7. 使用wait()、notify()和notifyAll()方法:通过Object类提供的wait()、notify()和notifyAll()方法来实现线程间的通信和协作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值