Java多线程
1、多线程概述
当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程。主要以下几个优点:
- 线程之间很容易实现共享内存
- 创建线程代价较小
- Java语言内置多线程功能支持
Ø 定义Thread的子类,并重写run方法
Ø 创建Thread子类的实例,即创建了线程对象
Ø 用线程对象的start方法来启动该线程
1 public class DemoThread extends Thread 2 { 3 private int i; 4 String name; 5 public DemoThread(String name) 6 { 7 super(name); 8 } 9 public void run() 10 { 11 for(;i<100;i++) 12 System.out.println(Thread.currentThread().getName()+"-------"+i); 13 14 } 15 public static void main(String[] args) 16 { 17 for(int i=0;i<100;i++) 18 { 19 System.out.println(Thread.currentThread().getName()+"-----------"+i); 20 21 if(i==20) 22 { 23 new DemoThread("windows1").start(); 24 new DemoThread("windows2").start(); 25 } 26 } 27 } 28 }
Ø 定义Runnable接口的实现类,并重写该接口的run方法(该方法是该线程的线程执行体)
Ø 创建Runnable实现类的实例,并以此实例作为Thread的target来创建Tread对象
1 public class DemoThread implements Runnable 2 { 3 private int i; 4 public void run() 5 { 6 for(;i<100;i++) 7 System.out.println(Thread.currentThread().getName()+"-------"+i); 8 9 } 10 public static void main(String[] args) 11 { 12 for(int i=0;i<100;i++) 13 { 14 System.out.println(Thread.currentThread().getName()+"-----------"+i); 15 16 if(i==20) 17 { 18 DemoThread t=new DemoThread(); 19 new Thread(t,"Windows1").start(); 20 new Thread(t,"Windows2").start(); 21 } 22 } 23 } 24 }
两种方法比较:
- 采用实现Runnable接口方式的线程还可以继承其他类,而继承Tread类后不能再继承其他父类。
- 实现Runnable接口方式的线程可以共享一个target对象,适合多个相同线程来处理同一份资源的情况
- 若需要访问当前线程,实现Runnable接口方式只能使用Thread.currentThread()方法,而继承Thread可直接使用this即获取当前线程。
synchronized (obj) { }
同步锁:它具有与使用
synchronized
方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。 使用Lock对象的代码格式如下:1 public class X 2 { 3 private final ReentrantLock lock=new ReentrantLock(); 4 public void m() 5 { 6 lock.lock();//加锁 7 try 8 { 9 //需要保证线程安全的代码 10 } 11 finally 12 { 13 lock.unlock();//释放锁 14 } 15 } 16 } 17
wait():告诉调用线程放弃监控器进入等待模式直到其他线程进入同一监控器并调用notify()方法。
- 调用Executors类的静态工厂方法创建一个ExecutorService对象,该对象代表一个线程池。
- 创建Runnable实现类或Callable实现类的实例,作为线程执行任务。
- 调用ExecutorService对象的submit方法提交Runnable实例或Callable实例。
- 当不想提交任何任务时调用ExecutorService对象的shutdown方法来关闭线程池。
1 class TestThread implements Runnable 2 { 3 public void run() 4 { 5 for(int i=0;i<50;i++) 6 { 7 System.out.println(Thread.currentThread().getName()+"---"+i); 8 } 9 } 10 } 11 public class TestMain 12 { 13 14 public static void main(String[] args) 15 { 16 // TODO 自动生成的方法存根 17 TestThread t=new TestThread(); 18 ExecutorService pool=Executors.newFixedThreadPool(6); 19 pool.submit(new Thread(t)); 20 pool.submit(new Thread(t)); 21 pool.shutdown(); 22 } 23 24 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。