java线程简单记录

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静态方法的锁是不同的,所以可以由多个线程同时使用。

猜你喜欢

转载自blog.csdn.net/weixin_40873802/article/details/89738086
今日推荐