1、顺序、并行、并发
顺序:一个一个处理
并行:一起处理
并发:将一个操作分割成多个部分并且允许无序处理
多线程程序大多都是并发处理的,如果CPU只有一个,那么并发处理就是顺序执行的,而如果CPU有多个,那么并发处理就可能会并行运行。
2、线程的启动
(1)利用Thread类的子类的实例来启动线程
(2)利用Runnable接口的实现类的实例来启动线程
eg:(1)继承Thread
class PrintThread extents Thread{
private String message;
public PrintThread(String message){
this.message = message;
}
public void run(){
for(int i=0;i<20;i++){
System.out.println(i+":"+message);
}
}
}
class Main{
public static void main(String[] args) {
new PrintThread("shaoyan").start();
new PrintThread("hsish").start();
}
}
//output
...
8:shaoyan
16:hsish
9:shaoyan
10:shaoyan
11:shaoyan
17:hsish
18:hsish
19:hsish
12:shaoyan
13:shaoyan
14:shaoyan
...
(2)直接实现Runnable接口
class printThread_two implements Runnable{
private String message;
public printThread_two(String message){
this.message = message;
}
@Override
public void run() {
for(int i=0;i<20;i++){
System.out.println(i+":"+message);
}
}
}
public class PrintThreadMain {
public static void main(String[] args) {
new Thread(new printThread_two("hshsh_two")).start();
new Thread(new printThread_two("shaoyan_two")).start();
}
}
//output
...
2:hshsh_two
3:hshsh_two
4:hshsh_two
5:hshsh_two
5:shaoyan_two
6:shaoyan_two
7:shaoyan_two
8:shaoyan_two
6:hshsh_two
7:hshsh_two
...
小知识:利用ThreadFactory新启动线程
ThreadFactory ft = Executors.defaultThreadFactory();
ft.newThread(new printThread_two("newnew_two")).start();
3、线程的暂停
Thread.sleep(1000); //休息1000毫秒(1秒)
public static void main(String[] args) {
for(int i=0;i<20;i++){
System.out.println("good!");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
4、线程的互斥处理(synchronized)
如果在声明一个方法时,在前面加上关键词synchronized,那么这个方法就只能由一个线程运行。只能由一个线程运行时每次只能由一个线程运行,并不是说仅能让某一特定线程运行,这种方法称为synchronized方法,也叫做同步方法。
eg:存钱取钱就是互斥线程(同一账户)。
public synchronized void deposite(int m){
money += m;
}
每个实例拥有一个独立的锁。因此,并不是说某一个实例中的synchronized方法正在执行,其他实例中的synchronized 就不能运行了,相当于不同的账号可以同时取钱、存钱一样,都不受影响。
5、线程的协作
(1)wait——将当前线程放入等待队列中
若要执行wait方法,线程必须持有锁。但如果线程进入等待队列,便会释放其实例的锁。
(2)notify——从等待队列中取出线程
(3)notifyAll——从等待队列中取出所有线程
这三个方法都是java.lang.Object类的方法,而不是Thread类中固有的方法。
注意:synchronized实例方法和synchronized静态方法的锁是不同的,所以可以由多个线程同时使用。