JAVA 线程基本知识汇总

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

IllegalMonitorStateException wait 还是notify 都必须确保自己取得对象的锁

如果不使用wait&notify的话,线程就会一直尝试去占用锁,会浪费性能。

wait 会释放锁 但是notify会释放吗? 如果不会释放 会发生什么事情 。

不会释放 如果释放了线程运行到一半会有问题 一直要到整个同步语句自行完成之后才会释放。

package org.famous.unyielding.current;

import java.util.Vector;

public class Client {

	public static void main(String[] args) {
		int goods = 0;
		Object pLock = new Object();
		Vector<String> message = new Vector<String>();
		Thread customer = new Thread(new Customer(message, "customer", pLock));
		Thread producter = new Thread(new Producter(message, "producter", pLock));
		customer.start();
		producter.start();

	}
}

package org.famous.unyielding.current;

import java.util.Vector;

/**
 * 
 * @author patzheng
 *
 */
public class Customer implements Runnable {

	private Vector<String> messages = new Vector();
	private String threadName;
	private Object pLock;

	public Customer(Vector<String> messages, String threadName, Object pLock) {
		this.messages = messages;
		this.threadName = threadName;
		this.pLock = pLock;
	}

	@Override
	public void run() {
		Thread.currentThread().setName(threadName);
		System.err.println(Thread.currentThread().getName() + "Goods‘s size" + messages.size());
		synchronized (pLock) {
			while (true) {
				if (messages.size() <= 0) {
					try {
						pLock.wait();
						System.err.println("customer wait");
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				} else {
					System.err.println(Thread.currentThread().getName() + "Goods‘s size" + messages.size());
					System.err.println("customer notify producer");
					messages.remove(0);
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					pLock.notify();
				}

			}

		}
	}
}

package org.famous.unyielding.current;

import java.util.Date;
import java.util.Vector;

public class Producter implements Runnable {

	private Vector<String> messages = new Vector();
	private String threadName;
	private Object pLock;

	public Producter(Vector<String> messages, String threadName, Object pLock) {
		this.messages = messages;
		this.threadName = threadName;
		this.pLock = pLock;
	}

	@Override
	public void run() {
		Thread.currentThread().setName(threadName);
		System.err.println(Thread.currentThread().getName() + "Goods‘s size" + messages.size());
		synchronized (pLock) {
			while (true) {
				if (messages.size() >= 1) {
					try {
						System.err.println("producer wait");
						pLock.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				} else {
					messages.add(new Date().toString());
					System.err.println(Thread.currentThread().getName() + "Goods‘s size" + messages.size());
					System.err.println("producer notify customer");
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					pLock.notify();
				}

			}
		}
	}
}
时间: 2024-12-28 11:01:41

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

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

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

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 Wo

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线程基础知识(状态、共享与协作)

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

java——线程

线程是一个程序里面不同的执行路径. 线程的的创建和启动 1. 定义线程类实现Runnable接口 public class TestThread1 { public static void main(String arg[]) { Runner1 r=new Runner1(); Thread t=new Thread(r); //Thread的实例来创建新的的线程 t.start(); //start方法来启动一个线程 for(int i=0;i<100;i++) { System.out.p

Java线程中的同步

1.对象与锁 每一个Object类及其子类的实例都拥有一个锁.其中,标量类型int,float等不是对象类型,但是标量类型可以通过其包装类来作为锁.单独的成员变量是不能被标明为同步的.锁只能用在使用了这些变量的方法上.成员变量可以被声明为volatile,这种方式会影响该变量的原子性,可见性以及排序性.类似的,持有标量变量元素的数组对象拥有锁,但是其中的标量元素却不拥有锁.(也就是说,没有办法将数组成员声明为volatile类型的).如果锁住了一个数组并不代表其数组成员都可以被原子的锁定.也没有