多线程

来源:互联网 发布:nginx并发连接数配置 编辑:程序博客网 时间:2024/06/06 18:41

java多线程实例三种实现方式:

1.继承Thread类,重写run方法。Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法。

2.实现Runnable接口,并实现接口的run()方法,创建一个Thread对象,用实现的Runnable接口的对象做为参数实例化Thread对象,调用此对象的start方法。

3.实现Callable接口(Java1.5),重写call方法,Callable接口与Runnable接口的功能类似,但提供了比Runnable更强大的功能,有以下三点:

  • Callable可以在任务结束后提供一个返回值,Runnable没有提供这个功能
  • Callable中的call方法可以跑出异常,而Runnable中的run方法不能抛出异常
  • 运行Callable可以拿到一个Future对象,表示异步计算的结果,提供了检查计算是否完成的方法。
run start的区别

start方法是启动一个线程,,调用start方法并不意味这立即执行多线程,而是使得线程变为可运行状态。

直接调用run方法,会将这个方法当作一个普通函数来调用,并没有多开辟线程。


sleep wait的区别

sleep方法让县城暂停执行一段时间,到时间会自动恢复运行,并不会释放所占用的锁,sleep是Thread的静态方法用来控制线程自身的流程,可以在任何地方使用。

wait方法会释放所占用的对象锁,等待其他线程调用notify方法才会再次醒来,wait是obejct的方法,用于进行线程通信,wait方法必须放在同步控制方法或者语句块中执行。


synchronized notify wait的运用

synchronized关键字有两种用法,synchronized方法和synchronized语句块。

public synchronized void function(){}

synchronized(object){}

当某个资源被synchronized所修饰,线程1线程2等多个线程在共同请求这个资源,线程1先请求到,调用了对象的wait方法释放了对象的锁,此时线程2可以对这个对象进行访问,在工作结束时可以调用对象的notify方法,唤醒等待队列中正在等待的线程,此时被唤醒的县城将会再一次拿到对象锁,对对象进行操作,可以调用notifyAll方法,唤醒等待队列的所有线程。线程被唤醒并不代表立即获取对象锁,必须等调用的线程对象的方法退出synchronized块释放对象锁后,被唤醒的进程才会获得对象锁。


join方法

join方法使调用该方法的线程在此之前执行完毕,也就是等待该方法的线程执行完毕后再往下继续执行,注意该方法也需要捕捉异常。


yield方法

该方法与sleep方法类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会。


finalize方法

java提供finalize()方法,垃圾回收器准备释放内存的时候会先调用finalize()做必要的清理工作,这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。Java程序有垃圾回收器,所以一般情况下内存问题不用程序员关心,但有一种JNI(Java Native Interface)调用non-Java程序(C或C++),finalize()的工作就是回收这部分的内存。

class TestFinalize {    private intid;         public TestFinalize(intid) {         this.id =id;         System.out.println("TestFinalize Object " +id +"is created");     }  protected void finalize()throws java.lang.Throwable {         super.finalize();          System.out.println("Cake Object " +id +"is disposed");     }  }

public class Test {public static void main(String[] args){try {TestFinalize t1 = new TestFinalize(0);t1 = null;System.gc();} catch (Exception e) {e.printStackTrace();}}}