一、线程的俩个方法
yield:理论上让出cpu,但是支持的不够好
setPriority():设置执行的优先级
单例设计模式:保证类在内存中只有一个对象。
如何保证类在内存中只有一个对象呢?
1.控制类,不让其他类来创建本类对象
2.定义一个本类对象。
3.提供共有的方法对象的方法
二、单列写法有俩种
/*饿汉式
* class Singleton{
//私有化其构造函数
private Singleton(){}
//创建本类私有实例对象
private static Singleton s = new Singleton();
public static Singleton getInstance(){
return s;
}
}*/
* class Singleton{
//私有化其构造函数
private Singleton(){}
//创建本类私有实例对象
private static Singleton s = new Singleton();
public static Singleton getInstance(){
return s;
}
}*/
//懒汉式
class Singleton {
private Singleton(){}
private static Singleton s;
public static Singleton getInstance(){
if(s == null){
s = new Singleton();
}
return s ;
}
}
class Singleton {
private Singleton(){}
private static Singleton s;
public static Singleton getInstance(){
if(s == null){
s = new Singleton();
}
return s ;
}
}
//单列模式的第三种办法
class Singleton1{
private Singleton1(){}
private final Singleton1 s = new Singleton1();
}
class Singleton1{
private Singleton1(){}
private final Singleton1 s = new Singleton1();
}
Runtime类是一个单例类
public class Demo4_Runtime {
/**
* @param args
* Runtime 是一个单例类
* @throws IOException
*/
public static void main(String[] args) throws IOException {
Runtime r = Runtime.getRuntime();
//r.exec("shutdown -s -t 300"); //计算机在300秒后关闭
r.exec("shutdown -a"); //取消计算机关闭
}
}
/**
* @param args
* Runtime 是一个单例类
* @throws IOException
*/
public static void main(String[] args) throws IOException {
Runtime r = Runtime.getRuntime();
//r.exec("shutdown -s -t 300"); //计算机在300秒后关闭
r.exec("shutdown -a"); //取消计算机关闭
}
}
三.线程之间的通信
1.什么时候需要通信
多个线程并发执行时, 在默认情况下CPU是随机切换线程的
如果我们希望他们有规律的执行, 就可以使用通信, 例如每个线程执行一次打印
2.怎么通信
如果希望线程等待, 就调用wait()
如果希望唤醒等待的线程, 就调用notify();
这两个方法必须在同步代码中执行, 并且使用同步锁对象来调用
3.多个线程通信的问题
notify()方法是随机唤醒一个线程
notifyAll()方法是唤醒所有线程
JDK5之前无法唤醒指定的一个线程
如果多个线程之间通信, 需要使用notifyAll()通知所有线程, 用while来反复判断条件
1.什么时候需要通信
多个线程并发执行时, 在默认情况下CPU是随机切换线程的
如果我们希望他们有规律的执行, 就可以使用通信, 例如每个线程执行一次打印
2.怎么通信
如果希望线程等待, 就调用wait()
如果希望唤醒等待的线程, 就调用notify();
这两个方法必须在同步代码中执行, 并且使用同步锁对象来调用
3.多个线程通信的问题
notify()方法是随机唤醒一个线程
notifyAll()方法是唤醒所有线程
JDK5之前无法唤醒指定的一个线程
如果多个线程之间通信, 需要使用notifyAll()通知所有线程, 用while来反复判断条件
多生产者和消费者 JDK1.5版本升级版。
Lock接口
Lock 替代了synchronized
Condition 替代了 Object监视器方法
好处:将同步synchronized 替换成了 Lock
将object中的wait notify notifyAll 替换成了 Condition对象
该对象可以Lock锁进行获取。一个锁可以对应多个Condition对象
注意:释放锁的工作一定要执行
。
示例代码
private Lock lock=new ReentrantLock();
private Condition condition =lock.newCondition();
public void cet(String name ) throws
{
lock.lock();
try
{
while(flag)
contidition.await();
this.name=name+"--"+count++;
sop(Thread.currentThread().getName()+"...生产者..."+this.name)
flag=true;
condition.signalAll();
}
finally
{
lock.unlock();
}
}
Lock接口
Lock 替代了synchronized
Condition 替代了 Object监视器方法
好处:将同步synchronized 替换成了 Lock
将object中的wait notify notifyAll 替换成了 Condition对象
该对象可以Lock锁进行获取。一个锁可以对应多个Condition对象
注意:释放锁的工作一定要执行
。
示例代码
private Lock lock=new ReentrantLock();
private Condition condition =lock.newCondition();
public void cet(String name ) throws
{
lock.lock();
try
{
while(flag)
contidition.await();
this.name=name+"--"+count++;
sop(Thread.currentThread().getName()+"...生产者..."+this.name)
flag=true;
condition.signalAll();
}
finally
{
lock.unlock();
}
}
特殊情况,改变标记也不会停止的情况。
将处于冻结状态的线程恢复到运行状态。interrupt(); 中断线程。
守护线程:
SetDaemon将线程标记为守护线程或用户线程。在启动线程前调用 。当线程都为守护线程后,JVM退出。
JOin方法:
t.join();抢过cpu执行权。
当A线程执行到了B线程的join方法时,A就会等待,等B线程执行完,A才会执行。Join可以用来临时加入线程执行。
优先级:
SetPriority(1-10)设置优先级。
Thread.MAX_PRIORITY 10
Thread.MIN_PRIORITY 1
Thread.NORM_PRIORITY 5
yield方法:暂停当前正在执行的线程对象,并执行其他线程。
开发中应用::保证以下三个代码同时运行。
将处于冻结状态的线程恢复到运行状态。interrupt(); 中断线程。
守护线程:
SetDaemon将线程标记为守护线程或用户线程。在启动线程前调用 。当线程都为守护线程后,JVM退出。
JOin方法:
t.join();抢过cpu执行权。
当A线程执行到了B线程的join方法时,A就会等待,等B线程执行完,A才会执行。Join可以用来临时加入线程执行。
优先级:
SetPriority(1-10)设置优先级。
Thread.MAX_PRIORITY 10
Thread.MIN_PRIORITY 1
Thread.NORM_PRIORITY 5
yield方法:暂停当前正在执行的线程对象,并执行其他线程。
开发中应用::保证以下三个代码同时运行。