Java程序员必需掌握的 4 大基础! (3)

public class MultithreadingTest implements Runnable {     @Override     public void run() {         System.out.println("Thread "+Thread.currentThread().getName()+" is now running"); //To change body of generated methods, choose Tools | Templates.     }     public static void main(String\[\] args)     {         for(int i=0;i<10;i++)         {             Thread thread = new Thread(new MultithreadingTest());             thread.start();         }     } }

关注微信公众号: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()方法。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwpypy.html