你的位置:首页 > Java教程

[Java教程]Runnable,Thread实现多线程以及Runnable的同步资源共享


(一)

     实现多线程有两种方式

    (1)

     继承Thread类,重写run()方法,如以下例子

     class MyThread extends Thread{

         public void run(){

         //

         }

     }

   class Main{

        public void main(String[] args){

        MyThread thread=new Mythread();

        thread.start();

        }

    }

    (2)

    利用runnable接口实现

    

    class MyThread implements Runnable{

         public void run(){

         //

         }

     }

   class Main{

       public static void main(String[] args){

       MyThread thread=new MyThread();//实例化runnable对象

       Thread thread1=new Thread(thread);//通过Thread传递runnable对象

       thread1.start();

       }

   }

(二)在利用Runnable进行多线程时,则有时候需要资源共享

当分配一个任务给多人时,假如要实现资源共享那么就用到

synchronized (this){

同步代码块

}

那我们就举个买票的例子

定义个ThreadTicket类

package MyThread;public class ThreadTicket{	public static void main(String[] args)	{		MyThread myThread1=new MyThread();		Thread t1 = new Thread(myThread1);//一窗口		Thread t2 = new Thread(myThread1);//二窗口		Thread t3 = new Thread(myThread1);//三窗口		t1.start();		t2.start();		t3.start();	}}

  此时的实现MyThread接口类

package MyThread;public class MyThread implements Runnable{	private int ticket = 10;	@Override	public void run()	{		//synchronized (this)		//{			for (int i = 0; i < 10; i++)			{				try				{					Thread.sleep(500);				} catch (InterruptedException e)				{					// TODO 自动生成的 catch 块					e.printStackTrace();				}				if (ticket > 0)					System.out.println("车票 :" + ticket--);			}		//}	}}

  由MyThread类可以得出此时的购票总数是10张票,分三个窗口买,那么此时就需要三个窗口共享票源,当没票时就不再进行售票

当不添加synchronized关键字时,此时显示的结果为

可以看到此时的结果是杂乱无章,完全没有达到资源共享

此时应该利用synchronized(this)

{

//code

}

同步代码块来实现资源共享

 

就是将MyThread的synchronized部分注释解除,此时的结果为

成功实现了资源共享的目的。

Runnable的很大的优点就在于资源共享。