多进程:在操作系统中能(同时)运行多个任务(程序)
多线程(multiple thread):在同一应用中有多个顺序流(同时)执行
线程lifecycle
//使用线程的方法一:继承Thread类
class FirstThread extends Thread(){
//编写Run方法
public void run(){
for(int i = 0; i < 100; i++){
System.out.println("");
}
}
}
class Test{
public static void main(String args[]){
//生成线程类对象
FirstThread ft = new FirstThread();
//启动线程 ,使用start()方法,继承于Thread class
//ft.run(); 单线程,不能这样写
ft.start();//多线程
}
}
Test class里有三个线程,将两个,一个是ft对象代表的线程,一个是Main()线程,(还有一个垃圾回收线程),CPU资源的分配是随机的。
//使用线程的方法二:接口Runnable
class runnableImp1 implements Runnable{
public void run(){
for(int i = 0; i < 100; i++){
System.out.println("...");
}
}
}
class Test{
public static void main(String args[]){
//生成一个Runnable接口实现类的对象
RunnableImpl ri = new RunnableImpl();
//生成一个Thread对象,并将Runnable接口实现类的对象作为参数
//传递给该Thread对象
Thread t = new Thread();
//通知Thread对象,执行start方法
t.start();
}
}
Java只支持单继承,推荐使用Runnable接口类
线程的简单控制方法
- 中断线程
Thread.sleep()
Thread.yield()
- 设置线程的优先级(1 - 10)
getPriority()
setPriority() by default, 优先级为5
优先级越大,执行的概率越大。
线程访问安全性
class MyThread implements Runnable{
int i = 100;
public void run(){
while(true){
//同步代码块
synchroized(this){
System.out.println(Thread.currentThread().getName() + i);
i--;
Thread.yield();
if(i < 0){
break;
}
}
}
}
}
class Test{
public static void main(String args[]){
MyThread myThread = new MyThread();
//生成两个Thread对象,共用同一个线程体
Thread t1 = new Thread(myThread);
Thread t2 = new Thread(myThread);
//每一个线程都有名字,可以通过Thread对象setName()设置线程名字,也可以使用getName()获取线程的名子。
t1.setName("线程a");
t2.setName("线程b");
t1.start();
t2.start();
}
}
多线程访问同一份资源,会出现多线程错误。解决方法:使用同步锁synchronized(this)
深入synchronized关键字
同步代码块(锁住对象)与同步方法作用类似,区别是同步代码块直接指定对象,同步方法也是指this。