线程方法和对象

来源:互联网 发布:世界上的另一个你知乎 编辑:程序博客网 时间:2024/05/21 05:06

http://www.cnblogs.com/hunter-zyg/articles/4689989.html


1、Thread类中的一些方法:

interrupted() 为线程打中断标志,用isInterrupted()来判断

holdsLock(obj)

currentThread()

sleep(millis)

yield()


2、Object类中的一些方法:

hashCode()

notify()

notifyAll()

wait(timeout)


3、Sleep和Wait的区别:

package com.busymonkey.threadfunc;public class SleepWaitTest {     public static void main(String[] args) {         new Thread(new Thread1()).start();         try {             Thread.sleep(5000);         } catch (Exception e) {             e.printStackTrace();         }         new Thread(new Thread2()).start();     }          private static class Thread1 implements Runnable{         @Override         public void run(){             synchronized (SleepWaitTest.class) {             System.out.println("enter thread1...");                 System.out.println("thread1 is waiting...");             try {                 //调用wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池                 SleepWaitTest.class.wait();             } catch (Exception e) {                 e.printStackTrace();             }             System.out.println("thread1 is going on ....");             System.out.println("thread1 is over!!!");             }         }     }          private static class Thread2 implements Runnable{         @Override         public void run(){             synchronized (SleepWaitTest.class) {                 System.out.println("enter thread2....");                 System.out.println("thread2 is sleep....");                 //只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。                 SleepWaitTest.class.notify();//如果注释掉,则线程永远处于挂起状态。                 try {                     //sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,                     //但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。                     //在调用sleep()方法的过程中,线程不会释放对象锁。                     Thread.sleep(5000);                 } catch (Exception e) {                     e.printStackTrace();                 }                 System.out.println("thread2 is going on....");                 System.out.println("thread2 is over!!!");             }         }     } }


4、关于类锁和对象锁:

对象锁:

java的所有对象都含有1个互斥锁,这个锁由JVM自动获取和释放。线程进入synchronized方法的时候获取该对象的锁,当然如果已经有线程获取了这个对象的锁,那么当前线程会等待;synchronized方法正常返回或者抛异常而终止,JVM会自动释放对象锁。这里也体现了用synchronized来加锁的1个好处,方法抛异常的时候,锁仍然可以由JVM来自动释放。

类锁:

对象锁是用来控制实例方法之间的同步,类锁是用来控制静态方法(或静态变量互斥体)之间的同步。其实类锁只是一个概念上的东西,并不是真实存在的,它只是用来帮助我们理解锁定实例方法和静态方法的区别的。我们都知道,java类可能会有很多个对象,但是只有1个Class对象,也就是说类的不同实例之间共享该类的Class对象。Class对象其实也仅仅是1个java对象,只不过有点特殊而已。由于每个java对象都有1个互斥锁,而类的静态方法是需要Class对象。所以所谓的类锁,不过是Class对象的锁而已。获取类的Class对象有好几种,最简单的就是MyClass.class的方式。


0 0