关于java 多线程线程Thread 共享资源的简单用法和理解

最近看到JAVA里面对资源共享引入的synchronized的同步机制,我们都知道Thread这个类的构造函数里面有类似一个实现Runnable这个接口的类,这个类可以存放着多个线程之间的资源共享,比如:

    public Thread(Runnable target) {
        init(null, target, "Thread-" + nextThreadNum(), 0);
    }


这个代码里面可以看到我们可以直接写一个自己的类去实现这个接口Runnable,然后创建每个Thread用一份,就可以达到了资源共享了,比如:

        Runable_demo run = new Runable_demo();
        // TODO Auto-generated method stub
        new Thread(run,"Tread one").start();
        new Thread(run,"Tread two").start();
        new Thread(run,"Tread three").start();
        new Thread(run,"Tread four").start();
        new Thread(run,"Tread five").start();
        new Thread(run,"Tread six").start();


这里强调用一点,当然对于在自己实现的Runable_demo这个类里面可以直接定义一些private 非static的数据了,但是这里有个注意的是对于一个类的static变量,他们不管是不是重新new,他的资源都是共享的,比如:

        new Thread(new Runable_demo(),"Tread one").start();
        new Thread(new Runable_demo(),"Tread two").start();
        new Thread(new Runable_demo(),"Tread three").start();
        new Thread(new Runable_demo(),"Tread four").start();
        new Thread(new Runable_demo(),"Tread five").start();
        new Thread(new Runable_demo(),"Tread six").start();


/**
 * 
 */
package thread_test;

/**
 * @author Administrator
 *
 */
public class Runable_demo implements Runnable{

    private static int g_value = 100;
    /**
     * @param args
     */
    public static void main(String[] args) {
        
        // TODO Auto-generated method stub
        new Thread(new Runable_demo(),"Tread one").start();
        new Thread(new Runable_demo(),"Tread two").start();
        new Thread(new Runable_demo(),"Tread three").start();
        new Thread(new Runable_demo(),"Tread four").start();
        new Thread(new Runable_demo(),"Tread five").start();
        new Thread(new Runable_demo(),"Tread six").start();

    }

    /* (non-Javadoc)
     * @see java.lang.Runnable#run()
     */
    @Override
    public void run() 
    {
        while(true)
        {
            speical_print();
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    synchronized void speical_print()
    {
        if(g_value > 0)
            System.out.println(Thread.currentThread().getName()+" : ........ value = " + g_value--);
    }

}

猜你喜欢

转载自jinyike.iteye.com/blog/2299762