您的位置:首页 > 编程语言 > Java开发

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

2012-10-17 16:03 561 查看
自上次博文以来将近一月没写了,中间又有个国庆,期间在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,这对于长期存活的任务来说很有用,例如监听进入的套接字连接的任务。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: