14,线程1-定义线程的方式

2018-10-12  本文已影响2人  旅程中

1,继承Thread类创建线程:

public class MyThread extends Thread {  
  public void run() {  
   System.out.println("MyThread.run()");  
  }  
}  
 
MyThread myThread1 = new MyThread();  
MyThread myThread2 = new MyThread();  
myThread1.start();  
myThread2.start();  

2,实现Runnable接口创建线程

public class AccountingSync implements Runnable
{
    //共享资源(临界资源)
     static int i=0;

    /**
     * synchronized 修饰实例方法
     */
    public  void increase(){
        synchronized(this)
        {
            i++;
        }

    }
    @Override
    public void run() {
        for(int j=0;j<1000000;j++){
            increase();
        }
    }
    public static void main(String[] args) throws InterruptedException {
        AccountingSync instance=new AccountingSync();
        Thread t1=new Thread(instance);
        Thread t2=new Thread(instance);
        t1.start();
        t2.start();
        t1.join(1);
        t2.join(100);
        System.out.println(i);
    }

3,实现Callable接口通过FutureTask包装器来创建Thread线程

package com.xiancheng;
/**
 *Callable方式
 *
 *获取当前线程的对象的方法是:Thread.currentThread();
 */
import java.util.concurrent.Callable;

@SuppressWarnings("hiding")
public class Tickets<Object> implements Callable<Object>{

    @Override
    public Object call() throws Exception {
        System.out.println(Thread.currentThread().getName()+"-->我是通过实现Callable接口通过FutureTask包装器来实现的线程");
        return null;
    }

}

package com.xiancheng;
/**
 *Callable方式
 */
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class CallableTest {

    public static void main(String[] args) {
            Callable<Object> oneCallable = new Tickets<Object>();
            Callable<Object> twoCallable = new Tickets<Object>();
            
            FutureTask<Object> oneTask = new FutureTask<Object>(oneCallable);
            FutureTask<Object> twoTask = new FutureTask<Object>(twoCallable);
            
            Thread t1 = new Thread(oneTask);
            Thread t2 = new Thread(twoTask);

            System.out.println(Thread.currentThread().getName());

            t1.start();
            t2.start();


    }

}

4,线程池

package com.xiancheng;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 线程池方式
 * ExecutorService、Callable都是属于Executor框架。返回结果的线程是在JDK1.5中引入的新特征,还有Future接口也是属于这个框架,有了这种特征得到返回值就很方便了。 
通过分析可以知道,他同样也是实现了Callable接口,实现了Call方法,所以有返回值。这也就是正好符合了前面所说的两种分类

执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了。get方法是阻塞的,即:线程无返回结果,get方法会一直等待。
 */
public class Xianchengchi {

     private static int POOL_NUM = 10;       //线程池数量
    
    public static void main(String[] args) throws InterruptedException{
          ExecutorService executorService = Executors.newFixedThreadPool(5);  
            for(int i = 0; i<POOL_NUM; i++)  
            {  
                RunnableThread thread = new RunnableThread();

                //Thread.sleep(1000);
                executorService.execute(thread);  
            }
            //关闭线程池
            executorService.shutdown(); 

    }

}

线程池 已学习

12,新特征-有返回值的线程(实现Callable接口)(了解)

13,新特征-锁(上)
(在Java5中,专门提供了锁对象,利用锁可以方便的实现资源的封锁,用来控制对竞争资源并发访问的控制,这些内容主要集

中在java.util.concurrent.locks包下面,里面有三个重要的接口Condition、Lock、ReadWriteLock。)

14,锁对象:读写锁

15,Java线程:新特征-信号量(了解)

16,Java线程:新特征-条件变量(了解)

17,Java线程:新特征-原子量(了解)

18,Java线程:新特征-障碍器(了解)
java5中,添加了障碍器类,为了适应一种新的设计需求,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有

子任务都执行完成时候,才能执行主任务,这时候,就可以选择障碍器了。

上一篇下一篇

猜你喜欢

热点阅读