欢迎访问宙启技术站
智能推送

Java函数-如何使用多线程和同步?

发布时间:2023-06-11 02:23:13

Java是一种支持多线程编程的高级编程语言,Java程序员经常使用多线程来改善程序的性能和响应能力。这里将介绍Java中的多线程和同步。

一、Java中的多线程

Java中的多线程通常由线程类(Thread)实现。Java线程有5种状态:New(新建),Runnable(就绪),Blocked(阻塞),Waiting(等待)和Terminated(终止)。下面介绍Java中的线程类(Thread)的常用方法。

(1)void start():启动线程并让其进入就绪状态。

(2)void run():线程运行的代码块。

(3)boolean isAlive():检查线程是否处于存活状态。

(4)void join():等待线程结束。

(5)void sleep(long millis):让线程睡眠若干时间。

(6)void interrupt():中断线程。

下面是一个简单的Java多线程示例程序,该程序定义了两个线程,并让这两个线程同时运行。

class MyThread implements Runnable {

   Thread t; //线程类

   MyThread() {

      t = new Thread(this, "Demo Thread");

      System.out.println("Child thread: " + t);

      t.start();

   }

   public void run() {

      try {

         for(int i = 5; i > 0; i--) {

            System.out.println("Child Thread: " + i);

            Thread.sleep(500);

         }

     } catch (InterruptedException e) {

         System.out.println("Child interrupted.");

     }

     System.out.println("Exiting child thread.");

   }

}

class ThreadDemo {

   public static void main(String args[]) {

      new MyThread(); //创建一个新的线程

      try {

         for(int i = 5; i > 0; i--) {

            System.out.println("Main Thread: " + i);

            Thread.sleep(1000);

         }

     } catch (InterruptedException e) {

         System.out.println("Main thread interrupted.");

     }

     System.out.println("Main thread exiting.");

   }

}

程序输出:

Child thread: Thread[Demo Thread,5,main]

Main Thread: 5

Child Thread: 5

Child Thread: 4

Main Thread: 4

Child Thread: 3

Child Thread: 2

Main Thread: 3

Child Thread: 1

Exiting child thread.

Main Thread: 2

Main Thread: 1

Main thread exiting.

二、Java中的同步

当多个线程访问共享资源时,可能会出现竞态条件。如果给共享资源添加一个锁(同步),则在同一时刻只有一个线程可以访问该资源,从而避免了竞态条件。Java中,可以使用synchronized关键字实现同步。

(1)synchronized方法:synchronized关键字可以应用于方法或代码块。如果一个方法声明为synchronized,那么在该方法执行前,该方法所属的对象将被锁定。通常,同步方法用于保护对共享数据的访问。

public synchronized void methodname() {

   //method code

}

(2)synchronized代码块:synchronized的另一种形式是同步代码块,它只锁定指定的对象。

synchronized(object) {

   //Code to be synchronized

}

下面是一个简单的示例程序,该程序使用synchronized关键字使两个线程顺序地输出数字。

class Printer {

   synchronized void printNumbers() {

      for(int i = 1; i <= 5; i++) {

         System.out.println(Thread.currentThread().getName() + ": " + i);

         try {

            Thread.sleep(1000);

         } catch (InterruptedException e) {

            e.printStackTrace();

         }

      }

    }

}

class NumberPrinter implements Runnable {

   Printer p;

   NumberPrinter(Printer p) {

      this.p = p;

   }

   public void run() {

      p.printNumbers();

   }

}

class SynchronizedDemo {

   public static void main(String[] args) {

      Printer p = new Printer();

      NumberPrinter np1 = new NumberPrinter(p);

      NumberPrinter np2 = new NumberPrinter(p);

      Thread t1 = new Thread(np1, "Thread 1");

      Thread t2 = new Thread(np2, "Thread 2");

      t1.start();

      t2.start();

   }

}

程序输出:

Thread 1: 1

Thread 1: 2

Thread 1: 3

Thread 1: 4

Thread 1: 5

Thread 2: 1

Thread 2: 2

Thread 2: 3

Thread 2: 4

Thread 2: 5

在Java中使用多线程和同步可以提高程序性能和响应能力,但也需要注意线程安全问题。在实际编程中,需要根据具体的场景选择不同的多线程和同步技术来保证程序的正确性和性能。