JAVA 线程基本知识汇总--Join yield

Join 让执行这个方法的线程插队 ,让当前县城执行完再执行别的线程

package org.famous.unyielding.current.jooin;

public class ThreadJoinClient {
	public static void main(String[] args) {
		Thread t = new Thread(new Runnable() {
			@Override
			public void run() {
				System.err.println("Hello World");
			}
		});
		try {
			t.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		t.start();
		System.err.println("main thread");
	}

}

加Join 和不加Join的结果就是hello World 输出的顺序不一致。加了Join那么Hello World 会优先执行

Join(Long xx) Sleep(Long xx)的区别 。Join会释放锁,但是Sleep不会

首先验证Join(Long xx)的方法 第二证明Join锁机制:

package org.famous.unyielding.current.jooin;

public class ThreadJoinClient {
	public static void main(String[] args) {
		Thread t = new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					Thread.sleep(4000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.err.println("Hello World");
			}
		});
		t.start();
		try {
			t.join(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.err.println("main thread");
	}

}

必须先Start再Join 否则无效。!这点详细见join的源码:

  1. if (millis == 0) {
  2. while (isAlive()) {
  3. wait(0);
  4. }
  5. } else {

join的锁机制:

上面的代码中得看是谁调用了join 是主线程 所以停止的是主线程。

本质问题:join(1000)和sleep(1000)的区别是什么。让子线程Join 或者让主线程sleep 本质上都可以达到我们的要求。只要我们预估好时间。

但是如果不加时间呢。还是为了验证锁的问题。

就是join 会不会让调用它的线程释放锁。

1.join 的参数并不是一直等待到指定的时间,如果线程提前运行完成之后还是会提前结束等待的

2.

public class MyTest {
	public static void main(String[] args) {

		SonRun sonRun = new SonRun();
		Thread thread = new Thread(new JoinRunn(sonRun));
		thread.start();
		Thread thread2 = new Thread(new ThreeRrun(sonRun));
		thread2.start();

	}
}

// 我调用join 会释放锁吗
class JoinRunn implements Runnable {

	private SonRun sonrun;

	public JoinRunn(SonRun sonrun) {
		super();
		this.sonrun = sonrun;
	}

	@Override
	public void run() {
		synchronized (sonrun) {
			System.err.println("join run get the sonrun lock");
			try {
				sonrun.start();
				/***  zhongdian **/
				// sonrun.join(3000);
				Thread.sleep(3000);
				System.err.println("join run will execute after SonRun");
				for (int i = 0; i < Integer.MAX_VALUE; i++) {
					String newString = new String();
					Math.random();
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

class SonRun extends Thread {
	@Override
	public void run() {
		Long begin = System.currentTimeMillis();
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		Long end = System.currentTimeMillis();
		System.err.println(begin - end);
	}
}

class ThreeRrun implements Runnable {
	private SonRun sonrun;

	public ThreeRrun(SonRun sonrun) {
		this.sonrun = sonrun;
	}

	@Override
	public void run() {
		synchronized (sonrun) {
			System.err.println("what the time shold i fucked be execute");

		}
	}
}

这个代码的运行结果在JoinRunn的

// sonrun.join(3000);

Thread.sleep(3000);

分别运行结果是不同的。所以得警惕Join 是会释放锁这个问题的。

join() If any executing thread t1 calls join() on t2 i.e; t2.join() immediately t1 will enter into waiting state until t2 completes its execution.  t1调用了t2的join方法,那么t1就会先wait 直到时间结束或者t1运行结束。既然是wait,那么同步的或者加锁的究竟是哪个地方??

  1. yield()
  2. join()
  3. sleep()
  4. yield() method pauses the currently executing thread temporarily for giving a chance to the remaining waiting threads of the same priority to execute. If there is no waiting thread or all the waiting threads have a lower priority then the same thread will continue its execution. The yielded thread when it will get the chance for execution is decided by the thread scheduler whose behavior is vendor dependent.
  5. sleep() Based on our requirement we can make a thread to be in sleeping state for a specified period of time (hope not much explanation required for our favorite method).

下面关于Yield的

package org.famous.unyielding.current.jooin;

public class YieldThreadClient {
	public static void main(String[] args) {

		Thread thread1 = new Thread(new YieldRunn());
		Thread thread2 = new Thread(new YieldRunn());
		thread1.start();
		thread2.start();
	}

}

class YieldRunn implements Runnable {

	@Override
	public void run() {
		for (int i = 0; i < 130; i++) {
			System.err.println(i);
			if (i == 30) {
				Thread.yield();
			}
		}
	}
}
时间: 2024-10-10 15:25:08

JAVA 线程基本知识汇总--Join yield的相关文章

JAVA 线程基本知识汇总--线程中断

1.线程中断的结果专业术语 isInterrupted interrupted interrupt // 测试当前线程是否已经中断,同时会将线程的中断状态取消 Thread.interrupted(); // 在当前线程加上一个打断标记 ** 并不会真的立即停止线程 thread.interrupt(); // 测试线程是否已经中断 thread.isInterrupted(); 2.知识点: 直接调用interrupt 不会中断线程 package org.test; /*  * 线程中断演示

JAVA 线程基本知识汇总

任何一个时刻,对象的控制权(monitor)只能被一个线程拥有. 无论是执行对象的wait.notify还是notifyAll方法,必须保证当前运行的线程取得了该对象的控制权(monitor) 如果在没有控制权的线程里执行对象的以上三种方法,就会报java.lang.IllegalMonitorStateException异常. JVM基于多线程,默认情况下不能保证运行时线程的时序性 IllegalMonitorStateException wait 还是notify 都必须确保自己取得对象的锁

Java线程基础知识(状态、共享与协作)

1.基础概念 CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后---> 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源分配的最小单位,进程内部有多个线程,会共享这个进程的资源 线程:CPU调度的最小单位,必须依赖进程而存在. 澄清并行和并发 并行:同一时刻,可以同时处理事情的能力 并发:与单位时间相关,在单位时间内可以处理事情的能力 高并发编程的意义.好处和注意事项 好处:充分利用cpu的资源.加快用户响应的时间,程序模

Java线程专栏文章汇总(转)

原文:http://blog.csdn.net/ghsau/article/details/17609747 JDK5.0之前传统线程        Java线程(一):线程安全与不安全 Java线程(二):线程同步synchronized和volatile Java线程(三):线程协作-生产者/消费者问题 Java线程(四):线程中断.线程让步.线程睡眠.线程合并 Java线程(五):Timer和TimerTask JDK5.0之后并发包        Java线程(六):线程池 Java线程

Java线程专栏文章汇总

JDK5.0之前传统线程        Java线程(一):线程安全与不安全 Java线程(二):线程同步synchronized和volatile Java线程(三):线程协作-生产者/消费者问题 Java线程(四):线程中断.线程让步.线程睡眠.线程合并 Java线程(五):Timer和TimerTask JDK5.0之后并发包        Java线程(六):线程池 Java线程(七):Callable和Future Java线程(八):锁对象Lock-同步问题更完美的处理方式 Java

Java多线程示例(sleep,join,yield,wait,notify)

主线程等待子线程的多种方法 synchronized浅析 sleep 是静态方法,Thread.sleep(xx)谁调用谁睡眠. join 是合并方法,当前线程调用其他线程xx.join()则等到xx结束才能运行 yield 当前线程让出cpu进入就绪队列. wait,noitfy,synchronized配合使用对资源进行管理. synchronized(this)以及非static的synchronized方法(至于static synchronized方法请往下看),只能防止多个线程同时执

java线程中的 sleep() wait() yield()

sleep()方法是让线程休眠  可以指定时间  其实就是让线程进入阻塞状态  指定的时间过后 进入就绪状态  不释锁 相当于抱着锁睡觉 wait()  让线程进入等待状态  被唤醒后才会继续执行  释放锁 yield()   线程让步  使当前线程让出cpu资源  该线程进入就绪状态 给同等级的其他线程执行的机会  但也可能 当前线程又继续运行,因为只是进入了 就绪状态 .

Java调优知识汇总

查看java进程运行状况jps -lvm 查看java默认堆大小 java -XX:+PrintFlagsFinal | grep MaxHeapSize eclipse调试设置vm参数 在项目上右键,依次点击“Debug As ”-> “Debug Configurations ”,在Arguments 参数中的“VM arguments: ”中填入如下值即可. -Xms64m -Xmx128m 查看vm参数 public class TestMemory { /** * @param arg

java线程基本知识

如何去定义一个线程?(三种方式)    1.Thread:继承这个类,然后重写run方法:将业务逻辑或任务写到run方法中,然后调用start来启动线程:    2.Runnable: 实现这个接口,然后重写run方法,创建Thread对象将Runnable实现类对象作为参数传递,最后调用start启动线程:    3.Callable<T>:实现这个接口,然后重写Call方法: ---扩展---    面试问题:Runnable和Callable有什么不同?        包: