java多线程学习总结之一:基础原理

自上次博文以来将近一月没写了,中间又有个国庆,期间在coding上有松懈,惭愧啊。现在师兄师姐们都在忙着找工作,巴神“思考人生”附体,想些有的没的。忽然开学到现在一月过去了,总结这一个月学习时间好少!也该收收心开始学习了。暑假中重新看了thinking in java到并发这章的中间部分,java多线程是个难点,所以打算都做些记录并结合51CTO的一个多线程系列。

一:概念

操作系统中进程由PCB(进程控制块)、程序段、数据段组成的进程实体的运行过程(生命周期创建、调度、撤销)。为了减少进程切换的时空开销,引入了线程,把它作为调度和分派的基本单位。

二:java中线程

java中线程的产生有两种方法:

1.继承Thread类,实现public void run(){}方法,start()方法来启动。

2.实现Runnable接口,覆盖public void run(){}方法。

下面举两个分别实现上面两种方法的例子:

直接用Thread类创建实例

public class TestThread extends Thread{
    private String name;
 
    public TestThread(String name){
        this.name=name;
    }
    public void run(){
        for(int i=0;i<5;i++){
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(name+": "+i);
        }
    }
    public static void main(String args[]){
        Thread t1 = new TestThread("kate");
        Thread t2 = new TestThread("tom");
 
        t1.start();
        System.out.println(t1.currentThread());
 
        t2.start();
        System.out.println(t2.currentThread());
    }
}
实现Runnable接口例子:

public class RunnaThread implements Runnable{
    private String name;
 
    public RunnaThread(String name) {
        super();
        this.name = name;
    }
 
    public void run() {
        for(int i=0;i<5;i++){
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(name+": "+i);
        }
    }
 
}
public class TestRunnable {
    public static void main(String args[]){
        RunnaThread rt1 = new RunnaThread("kate");
        RunnaThread rt2 = new RunnaThread("tom");
 
        Thread t1 = new Thread(rt1);
        Thread t2 = new Thread(rt2);
 
        t1.start();
        t2.start();
    }
}
使用Executor执行器来管理Thread对象,Executor在java SE5/6中是启动任务的优先方法。Executor在客户端和任务之间提供了一个间接层;与客户端直接执行任务不同,这个中介对象将执行任务。Executor允许管理异步任务的执行,而无须显式地管理线程得生命周期。下面用Executor来代替显式的创建Thread对象。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class CachedThreadPool {
    public static void main(String args[]){
        ExecutorService exec = Executors.newCachedThreadPool();
        exec.execute(new RunnaThread("kate"));
 
        exec.shutdown();
    }
}
FixedThreadPool可以自己手动配置线程数。SingleThreadExecutor就是线程数为1的FixedThreadPool,这对于长期存活的任务来说很有用,例如监听进入的套接字连接的任务。

你可能感兴趣的:(java多线程)