一、线程
1、线程与进程
(1)进程每个程序都至少有一个进程,每个进程中都至少有一个线程。
(2)线程是进程的一个实体。
(3)进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程自己基本上不拥有系统资源。
2、启动线程
(1)每个java程序在运行的时候至少会启动一根线程
(2)我们可以通过继承Thread类或者实现Runnable接口来启动一个线程
注意:启动线程只能通过start()方法,不能使用run()方法启动。
3、join、sleep、yield方法
(1)join(),如果在线程1里面线程2调用了join方法,那么线程1就必须得到线程2运行完毕,才会继续运行。
(2)sleep(),如果使用sleep(1000),那么该线程会阻塞1s,才会继续执行。
(3)yield(),如果此线程使用了yield(),那么当他抢到执行机会的时候,它会不执行,然后重新抢。
4、同步锁(synchronized)
(1)在多根线程访问同一个方法或者代码块的时候,我们一般会使用synchronized锁住这个方法或者代码块,每次只能由一根线程访问。
5、wait()、notify()
(1)wait()让此线程阻塞在这里,直到有一个notify()将他唤醒。
(2)notify()唤醒wait()的线程
1、线程与进程
(1)进程每个程序都至少有一个进程,每个进程中都至少有一个线程。
(2)线程是进程的一个实体。
(3)进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程自己基本上不拥有系统资源。
2、启动线程
(1)每个java程序在运行的时候至少会启动一根线程
(2)我们可以通过继承Thread类或者实现Runnable接口来启动一个线程
public class ThreadTest {
public static void main(String[] args) {
// main方法会自动启动一根线程
System.out.println(Thread.currentThread().getName()+"启动了!");
// 通过Thread来启动一根线程
new myThread().start();
// 通过实现Runnable接口来启动一根线程
new Thread(new myRunnable()).start();
}
}
class myThread extends Thread {
@Override
public void run() {
//重写run方法,这里是线程的运行位置
System.out.println(getName()+"启动了!");
}
}
class myRunnable implements Runnable {
@Override
public void run() {
//重写run方法,这里是线程的运行位置
System.out.println(Thread.currentThread().getName()+"启动了!");
}
}
注意:启动线程只能通过start()方法,不能使用run()方法启动。
3、join、sleep、yield方法
(1)join(),如果在线程1里面线程2调用了join方法,那么线程1就必须得到线程2运行完毕,才会继续运行。
(2)sleep(),如果使用sleep(1000),那么该线程会阻塞1s,才会继续执行。
(3)yield(),如果此线程使用了yield(),那么当他抢到执行机会的时候,它会不执行,然后重新抢。
4、同步锁(synchronized)
(1)在多根线程访问同一个方法或者代码块的时候,我们一般会使用synchronized锁住这个方法或者代码块,每次只能由一根线程访问。
//锁住代码块
public void getMoney(String name, int money) {
synchronized (this) {
//需要被锁住的代码块
}
}
//锁住方法
public synchronized void getMoney(String name, int money){}
5、wait()、notify()
(1)wait()让此线程阻塞在这里,直到有一个notify()将他唤醒。
(2)notify()唤醒wait()的线程