当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程。主要以下几个优点:
Ø 定义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接口创建线程类
Ø 定义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 }
两种方法比较:
当两个或多个线程需要访问同一共享资源时,需要某种方式来确保资源在某一时刻只被一个线程使用,这个方式称为“同步“。
为了解决同步问题,java引入同步监视器,代码块格式如下:
synchronized (obj){}Java还使用Synchronized关键字来修饰某个方法,此方法就无需显示指定同步监视器。同步锁:它具有与使用
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 finally12 {13 lock.unlock();//释放锁14 }15 }16 }176、线程的通信Java为了避免轮询检测,通过wait()、notify()和notifyAll()方法实现进程内通信的机制。wait():告诉调用线程放弃监控器进入等待模式直到其他线程进入同一监控器并调用notify()方法。notify():唤醒在此同步器上等待的单个线程notifyAll():唤醒在此同步器上等待的所有线程7、线程池线程池在系统启动时就创建大量空闲的线程,程序将一个Runnable对象传给线程池,线程池就会启动一个线程来执行该对象的run方法,当run方法执行结束后该线程不会死亡,而是再次返回线程池中称为空闲状态的,等待执行下一个Runnable对象的run方法。使用线程池来执行线程任务的步骤如下:
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 TestMain12 {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 }执行结果:
新闻热点
疑难解答