关注微信公众号:Java技术栈,在后台回复:多线程,可以获取我整理的 N 篇最新多线程教程,都是干货。
Thread类与Runnable接口
扩展Thread类,就无法扩展更多的类,因为Java不允许多重继承。多重继承可以通过接口实现。所以最好是使用接口而不是Thread类。
如果扩展Thread类,那么它还包含了一些方法,如yield()、interrupt()等,我们的程序可能用不到。而在Runnable接口中就没有这些排不上用场的方法。
3、同步同步指的是多线程的同步。的代码块在同一时刻只能被一个线程执行。Java中的同步是个很重要的概念,因为Java是多线程语言,多个线程可以并行执行。在多线程环境中,Java对象的同步,或者说Java类的同步非常重要。
为什么要同步?
如果代码在多线程环境下执行,那么在多个线程中共享的对象之间需要同步,以避免破坏状态,或者造成任何不可预料的行为。
在深入同步的概念之前先来理解一下这个问题。
class Table { void printTable(int n) {//method not synchronized for (int i = 1; i <= 5; i++) { System.out.print(n * i+" "); try { Thread.sleep(400); } catch (Exception e) { System.out.println(e); } } } } class MyThread1 extends Thread { Table t; MyThread1(Table t) { this.t = t; } public void run() { t.printTable(5); } } class MyThread2 extends Thread { Table t; MyThread2(Table t) { this.t = t; } public void run() { t.printTable(100); } } class TestSynchronization1 { public static void main(String args\[\]) { Table obj = new Table();//only one object MyThread1 t1 = new MyThread1(obj); MyThread2 t2 = new MyThread2(obj); t1.start(); t2.start(); } }运行这段代码就会注意到,输出结果非常不稳定,因为没有同步。我们来看看程序的输出。
输出:
100 5 200 10 300 15 20 400 500 25 class Table { synchronized void printTable(int n) {//synchronized method for (int i = 1; i <= 5; i++) { System.out.print(n * i+" "); try { Thread.sleep(400); } catch (Exception e) { System.out.println(e); } } } } class TestSynchronization3 { public static void main(String args\[\]) { final Table obj = new Table();//only one object Thread t1 = new Thread() { public void run() { obj.printTable(5); } }; Thread t2 = new Thread() { public void run() { obj.printTable(100); } }; t1.start(); t2.start(); } }给printTable()方法加上,那么的方法在执行结束之前不会让其他线程进入。下面的输出结果就非常稳定了。
输出:
5 10 15 20 25 100 200 300 400 500类似地,Java的类和对象也可以同步。
注意:我们并不一定需要同步整个方法。有时候最好是仅同步方法的一小部分。Java的代码段可以实现这一点。
4、序列化Java中的序列化是一种机制,可以将对象的状态写入到字节流中。相反的操作叫做反序列化,将字节流转换成对象。
序列化和反序列化的过程是平台无关的,也就是说,在一个平台上序列化对象,然后可以在另一个平台上反序列化。
序列化时调用ObjectOutputStream的writeObject()方法,反序列化调用ObjectInputStream类的readObject()方法。