java创建线程的方式有几种?

Python011

java创建线程的方式有几种?,第1张

java创建线程的方式有三种\x0d\x0a第一种是继承Thread类 实现方法run() 不可以抛异常 无返回值\x0d\x0a第二种是实现Runnable接口 实现方法run() 不可以抛异常 无返回值\x0d\x0a第三种是实现Callable接口,接口中要覆盖的方法是 public call() 注意:此方法可以抛异常,而前两种不能 而且此方法可以有返回值\x0d\x0a\x0d\x0a第三种如何运行呢 Callable接口在util.concurrent包中,由线程池提交\x0d\x0aimport java.util.concurrent.*\x0d\x0aExecutorService e = Executors.newFixedThreadPool(10)参数表示最多可以运行几个线程\x0d\x0ae.submit()这个里面参数传 实现Callable接口那个类的对象

java中实现多线程常用的方法有以下三种:

/**

 * 方法一:继承Thread类,重写run方法

 * 

 * @author qd

 *

 */

public class MyThread extends Thread {

    @Override

    public void run() {

        super.run()

    }

}

/**

 * 方法二:实现Runnable接口,,重写run方法

 * 

 * @author qd

 *

 */

class MyThread1 implements Runnable {

    @Override

    public void run() {

    }

}

/**

 * 方法三:实现Callable<T>接口,重写call方法

 * 优点:可以传参数,有返回值类型(参数与返回值类型一致)

 * 

 * @author qd

 *

 */

class MyThread2 implements Callable<Integer> {

    @Override

    public Integer call() throws Exception {

        return null

    }

}

线程同步主要有以下种方法(示例中是实现计数的功能):

1、同步方法,即使用synchronized关键字修饰方法,例如:

public synchronized void add(int c){...}

2、同步代码块,即有synchronized关键字修饰的语句块,例如:

public void addAndGet(int c){

    synchronized(this){

      count += c

    }

}

3、使用特殊域变量(volatile)实现线程同步,该方法不能保证绝对的同步。

例如:private volatile int count = 0

4、使用锁实现线程同步,例如:

private Lock lock = new ReentrantLock()

  public void add(int c) {  

        lock.lock()//上锁  

        try{  

            count += c  

        }finally{  

            lock.unlock()//解锁  

        }  

    }

5、使用原子变量实现线程同步,在java的util.concurrent.atomic包中提供了创建了原子类型变量的工具类,例如:

private AtomicInteger count= new AtomicInteger(1)

public void add(int c) {

    count.addAndGet(c)

}

6、使用局部变量实现线程同步,如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本, 副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。

ThreadLocal 类的常用方法

new ThreadLocal<T>() : 创建一个线程本地变量

get() : 返回此线程局部变量的当前线程副本中的值

initialValue() : 返回此线程局部变量的当前线程的"初始值"

set(T value) : 将此线程局部变量的当前线程副本中的值设置为value

示例代码:

private static ThreadLocal<Integer> count= new ThreadLocal<Integer>(){

          @Override

          protected Integer initialValue(){ 

              return 1

             }

     }            

 

public void add(int c){

                count.set(count.get() + c)

    }

7、使用阻塞队列实现,例如LinkedBlockingQueue,具体使用可百度LinkedBlockingQueue的用法或查看java文档。