所写内容有点琐碎,按照课本目录照本宣科,此稿权且当做自己的复习思路吧。
---------------------------------------------------------------------------------------------------------------------
1.线程进程的区别
面试时曾经被问到过,一个程序的内部也可以实现多任务的并发执行,其中每个任务被称为线程。
具体区别:1)每个进程有独立的代码和数据空间,进程切换开销较大。
2)而同一类线程可以共享代码和数据空间,但每个线程就有独立的运行栈和程序计数器,线程切换开销较小。
2.创建线程:1)继承thread类
2)实现runnable接口
3.后台线程:指在后台运行的、为其他线程提供服务的线程,such as JVM的垃圾回收线程、定时器线程等,也称为守护线程。
当所有用户线程停止运行时,JVm也将退出。
//后台线程2有可能不会运行结束,因为主线程和线程一结束后,JVM检测到只有后台线程时 ,就退出了程序的运行。
public class TestDaemonThread {
public static void main(String[] args) {
Thread t1 = new MyRunner1(10);
t1.setName("线程1");
t1.start();
Thread t2 = new MyRunner1(100);
t2.setName("线程2");
t2.setDaemon(true);
t2.start();
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"i");
}
System.out.println("main----OVER");
}
}
class MyRunner1 extends Thread{
private int n;
public MyRunner1(int n){
this.n = n;
}
public void run(){
for(int i = 0; i < n; i++)
System.out.println(this.getName()+ ":" + i);
System.out.println(this.getName()+"OVER");
}
}
4.线程控制
线程5种状态:新建状态,就绪状态,运行状态,阻塞状态,终止状态。
5.线程串行化
//join方法会导致当前线程阻塞,知道sub线程运行结束,才会继续执行
public class TestJoin {
public static void main(String[] args) {
Thread t = new Thread(new MyRunner());
t.start();
try {
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(int i = 0; i < 50; i++){
System.out.println(Thread.currentThread().getName()+i);
}
}
}
class MyRunner implements Runnable{
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println("SubThread");
}
}
}