开发中用到的线程方法也是很常见的,其方法的区别理解清楚了,操作也就顺手了。线程中的常用的方法有如下几个,分别是sleep(),wait()和notify()和notifyAll()、suspend()和resume()、yield()、join()、interrupt()。下面我就以上方法做一个简单的介绍。首先是join()方法,该方法里面的参数是一个毫秒值,表示等待几秒执行该操作。它的主要作用就是同步,由线程的并行转换为串行。通俗的说就是停止当前的线程,让使用join的线程先执行完毕,再执行其它线程。代码如下:
线程任务类:
package cn.test; public class TaskMy implements Runnable{ @Override public void run() { for(int i=0;i<20;i++) { System.out.println(Thread.currentThread().getName()+"====="+i); } } }
创建线程并执行线程:
package cn.test; public class DemoMain { public static void main(String[] args) throws InterruptedException { // 创建对象 TaskMy task = new TaskMy(); TaskMy task2 = new TaskMy(); // 创建线程对象 Thread t1 = new Thread(task, "线程1"); Thread t2 = new Thread(task2, "线程2"); // 启动线程 t1.start(); // 暂停其它线程,让t1执行完再执行其它线程 t1.join(); t2.start(); } }
这串代码的作用是先执行t1线程,再执行t2线程。对于这样,如果改变join和start方法的顺序,结果是不一样,失去了同步的作用。join的原理说的简单点就是,调用其它线程的wait方法,执行完毕后再执行notifyAll方法。
Sleep和wait方法之间有什么区别,这个也是必须要掌握的。首先sleep是线程的方法,而wait是Object方法。sleep它是让出CPU资源,暂停设置的时间,时间一到,恢复运行状态,最主要的是它不会释放对象锁。而调用wait方法,释放对象锁,处于挂起状态,只有调用notifyAll才可以进入对象锁定池。下面是代码案例:
package cn.test; public class TaskMy implements Runnable{ @Override public void run() { System.out.println("线程1执行"); for(int i=0;i<100;i++) { try { // 线程睡眠 Thread.sleep(100); System.out.println(Thread.currentThread().getName()+"====="+i); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("线程1结束"); } }