zoukankan      html  css  js  c++  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接口实现,但是若只是定义了Runnable对象,如

    public class Myobject
    {
    	public static void main(String[] args)
    	{
    		//System.out.println("主线程" + Thread.currentThread().getName());
    		Runnable myRunnable = new Runnable()
    		{
    			@Override
    			public void run()
    			{
    				System.out.println(Thread.currentThread().getName());
    			}
    		};
    	}
    }
    

      Runnable对象必须依赖一个Thread类才能真正意义上说是另外开辟了一个线程,不然是默认在主线程中的,在Android更新UI有这种应用,利用runOnUiThread(runnable)来在主线程的某一块调用Runnable的run方法,此时并没有开辟另外的线程,而是在主线程中执行的,这一点应该分清楚。

    真正意义上的开辟另外的线程看下面,需要Thread.start()来调用Runnable接口的run方法    

        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();//利用Thread线程类启动Runnable接口的run方法

           }

       }

    (二)在利用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的很大的优点就在于资源共享。

    未经博主同意该原创文章不得转载
  • 相关阅读:
    记账程序2.0
    安装redHat6.5详细图文教程
    redHat6设置ip地址
    如何开通B站的直播空间
    python实战技巧之两个字典,如何实现键同则值相加【不等长或等长】
    python实战技巧之去除列表中的空值元素
    python实战技巧之两个不等长列表让里面的数字一一对应地相加
    python实战技巧之两个列表实例中,如何让里面的数字一一对应地相加【对于两个列表是等长的情况】
    java基础_网络编程
    java基础_String
  • 原文地址:https://www.cnblogs.com/Cc1231/p/4807374.html
Copyright © 2011-2022 走看看