Java多线程初级学习总结
Java多线程初级学习总结
- 一.Java创建线程的几种方法
- 二.Thread类常用方法
- 三.sleep方法与wait方法的区别
- 四.start方法与run方法的区别
- 五.Synchronized与Lock的区别
- 附录
一.Java创建线程的几种方法
- 继承Thread类
public class MyThread extends Thread {@Overridepublic void run() {super.run();System.out.println("你好");}
}
------------------------------------------------
public class ThreadTest {public static void main(String[] args) {MyThread myThread = new MyThread();myThread.start();}
}
- 实现Runnable接口
public class MyThread1 implements Runnable {@Overridepublic void run() {System.out.println("你好");}
}--------------------------------------------------
public class MyThread1Test {public static void main(String[] args) {MyThread1 myThread1 = new MyThread1();Thread thread = new Thread(myThread1);thread.start();}
}
- 实现Callable接口
public class MyThread3 implements Callable<String> {@Overridepublic String call() throws Exception {return "hello";}
}--------------------------------------------------
public class Thread3Test {public static void main(String[] args) throws ExecutionException, InterruptedException {MyThread3 myThread3 = new MyThread3();FutureTask futureTask = new FutureTask(myThread3);new Thread(futureTask).start();System.out.println(futureTask.get());}
}
- 使用线程池
public class TestCallable implements Callable<String> {@Overridepublic String call() throws Exception {return "通过线程池实现多线程";}
}
--------------------------------------------------
public class NewTest {public static void main(String[] args) throws ExecutionException, InterruptedException {TestCallable testCallable = new TestCallable();ExecutorService executorService = Executors.newFixedThreadPool(3);// 提交任务Future<String> future = executorService.submit(testCallable);String result = future.get();System.out.println(result);}
}
二.Thread类常用方法
- join方法
A线程调用B线程的Join方法,将会使A等待B执行直到等待B线程终止,如果传入time参数将会使A等待B执行time时间,如果time时间到达,将会切换进A线程继续执行A线程。 - yield方法
yield方法:当前线程放弃CPU的使用切换其他线程使用,执行此方法会向系统线程调度器(scheduler)发出一个暗示,告诉当前Java线程打算放弃对CPU的使用,但该暗示有可能被调度器忽略。 - interrupt方法
该方法终端当前线程的执行,允许当前线程对自身进行终端,否则将会校验调用方法线程是否有该线程的权限。 - interrupted
查看当前线程是否处于中断状态,该方法特殊之处在于如果调用成功,当前线程的interrupt status清除。所以如果连续两次调用该方法第二次返回false - stop(已过时)
由于stop方法可以让一个线程A终止掉另一个线程B,被终止的线程B会立即释放锁,这可能会使对象处于不一致状态。
三.sleep方法与wait方法的区别
- sleep方法属于Thread类,而wait方法属于Object类中的。
- sleep方法导致程序暂停给了暂停时间,让出CPU给其他线程,但他的监控状态依旧保持着,到了时间又会恢复运行状态。
- 在调用sleep方法的过程中线程不会释放掉锁对象。
- 当调用wait方法时,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后,该线程才进入对象锁定池,准备获取对象锁进入运行状态。
四.start方法与run方法的区别
- start方法用来启动线程真正实现了多线程运行。这时无需等待run方法执行完毕可以继续执行下面的代码。
- 通过调用Thread类的start方法来启动一个线程,此时线程是处于就绪状态并没有运行。
- 方法run()称为线程体,包含了要执行的这个线程的内容,线程进入了运行状态,开始运行run函数中的代码,run()方法运行结束,此时线程终止,然后CPU再调度其他线程。
五.Synchronized与Lock的区别
- Synchronized是Java内置的关键字,Lock是Java的一个类。
- Synchronized无法获取锁的状态,Lock可以判断是否获取到了锁。
- Synchronized会自动释放锁,Lock必须手动释放锁!如果不释放会造成死锁。
- Synchronized 线程1(获取锁,阻塞),线程2(等待,傻傻的等待),Lock锁就不一定会等下去。
- Synchronized可重入锁,不可中断,非公平的,Lock锁是可重入的锁,公平不公平可以设置。
附录
1.并发编程