1.什么是进程?什么是线程?
进程是指一种正在进行的程序,它有着自己的地址空间。线程则是进程的一个执行单元。
2.实现多线程的两种方式。
1.继承Thread类,并重写Run() 方法。
public class Tell extends Thread {
@Override
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println(Thread.currentThread().getName()+"..."+i);
}
}
}
Thread.currentThread() 方法是获取当前线程的对象,getName() 方法获取线程的名称。
2.实现Runnable接口,重写Run() 方法。
public class ThreadTestRunnable implements Runnable{
int ticket = 30;
@Override
public void run() {
while(ticket>0){
System.out.println(Thread.currentThread().getName()+"......"+ticket--);
}
}
3.两种实现方法的区别
1.继承了Thread类,则不能在继承其他类;
2.实现了Runnable接口,则还可以继承其他类;
3.实现Runnable接口可以共享资源。
4.线程中常用的方法
1.isAlive 用于判定线程对象是否处于活动的状态
2.join ---等待该线程终止,强制让某个线程优先执行结束
public class Tell extends Thread {
@Override
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println(Thread.currentThread().getName()+"..."+i);
}
}
public static void main(String[] args) {
//主线程开始
System.out.println("---main开始");
Tell te = new Tell();
te.start();
//-----两条线程同时运行
for (int i = 0; i < 30; i++) {
System.out.println(Thread.currentThread().getName()+"*****"+i);
if(i == 10){
try {
te.join();//等待te终止 -----1.te线程执行完 再终止 2.te没有执行完就终止了
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//主线程结束
System.out.println("---main结束");
}
}
3.sleep(毫秒数) ----休眠
public class Tell1 extends Thread{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"..."+i);
try {
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Tell1 te = new Tell1();
te.start();
//1秒 = 1000 毫秒
}
}
4.setPriority ----设置线程的优先级
5.setDaemon(boolean),将该线程标记为守护线程或用户线程
6.isDaemon()判定一条线程是否是守护线程
7.yield ----暂停当前正在执行的线程对象,并执行其他线程。
5.线程的状态
线程有总共分为四大状态:
1.新生态 ----在创建线程对象以后,还没有调用start方法之前
2.可运行态 ----调用了start方法之后,线程的状态可能是正在运行的状态也可能是处于等待运行的状态
3.阻塞态 ----一种“不可运行”的状态,在得到一个特定的事件之后 会返回到可运行状态
4.死亡态 ---- 线程的run方法运行完毕或者在运行中出现未捕获的异常时
6.解决线程不安全的问题,给资源加上同步锁synchronized
1.使用synchronized去修饰方法
public synchronized void f(){
}
//同步方法是给方法中的资源加上同步锁
2.单独成立代码块
public void m(){
synchronized (this) {
}
}
同步代码块 针对的是某一个资源