进程是应用程序的执行实例,有独立的内存空间和系统资源。进程是资源分配的最小单位
线程是cpu调度的最小单位,cpu调度和分派的基本单位
一个线程的生命周期分为:创建、就绪、运行、阻塞、终止
线程的创建方式1:继承Thread类 重写run方法
public class T1 extends Thread{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
T1 t1 = new T1();
t1.setName("线程A");
t1.start(); // 调用start方法才会开启新的线程
// t1.run(); 调用run方法不会开启新的线程 依然使用main线程调用run方法
}
}
创建线程方式2 :实现Runnable接口 重写run方法
public class T2 implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
T2 t2 = new T2();
Thread thread = new Thread(t2, "线程A");
thread.start();
}
}
继承Thread类:
编写简单,可直接操作线程
适用于单继承
实现Runnable接口:
避免单继承局限性
便于共享资源
推荐使用实现Runnable接口方式创建线程
设置优先级的方法:setPriority();
线程的优先级 默认为5 最低为1 最高为10
优先级高代表获取CPU的概率较大 并不能保证一定会优先获得CPU资源
MAX_PRIORITY 最高10
MIN_PRIORITY 最低1
NORM_PRIORITY 默认5
public class T1 extends Thread{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + i);
}
}
public static void main(String[] args) {
T1 thread1 = new T1();
thread1.setName("赵四");
T1 thread2 = new T1();
thread2.setName("广坤");
System.out.println(thread1.getPriority());
System.out.println(thread2.getPriority());
thread1.setPriority(Thread.MAX_PRIORITY); // 设置优先级为最高 10
thread2.setPriority(1);// 设置优先级为最低 1
thread1.start();
thread2.start();
}
}
线程休眠的方法 sleep(long mills)
方法为:join() 等待插队线程执行完毕 再执行当前线程
join(long mills) 等待插队线程固定时间 时间结束就执行当前线程
yield()方法 线程礼让 当前线程礼让其他线程 让其他线程先执行
只是提供一种可能 不一定会礼让
interrupt() 中断线程方法 但不是立即中断 如果当前线程有未执行完的任务 将执行完毕再中断
interrupted() 查看当前线程是否可以被中断 true为是 false为否
stop() 为立即中断线程的方法(已弃用)
处理多线程共享数据引发的问题
public class T4 implements Runnable{
int count = 10;
@Override
public void run() {
while(true ) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(new Object()) {
if(count == 0) {
break;
}
count--;
System.out.println(Thread.currentThread().getName() + "抢到了第"+ (10 - count)+" 张票,还剩余" + count + "张票");
}
}
// 后续代码
}
public static void main(String[] args) {
T4 t3 = new T4();
Thread zhaosi = new Thread(t3, "赵四");
Thread guangkun = new Thread(t3, "广坤");
Thread dana = new Thread(t3, "大拿");
zhaosi.start();
guangkun.start();
dana.start();
}
}
使用同步方法实现
public class T5 implements Runnable{
int count = 10;
@Override
public synchronized void run() {
while(count > 0) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
count--;
System.out.println(Thread.currentThread().getName() + "抢到了第"+ (10 - count)+" 张票,还剩余" + count + "张票");
}
// 后续代码
}
public static void main(String[] args) {
T5 t3 = new T5();
Thread zhaosi = new Thread(t3, "赵四");
Thread guangkun = new Thread(t3, "广坤");
Thread dana = new Thread(t3, "大拿");
zhaosi.start();
guangkun.start();
dana.start();
}
}
同一时刻只能有一个线程进入synchronized(this)同步代码块
当一个线程访问一个synchronized(this)同步代码块时,其他synchronized(this)同步代码块同样被锁定
当一个线程访问一个synchronized(this)同步代码块时,其他线程可以访问该资源的非synchronized(this)同步代码
原文:https://www.cnblogs.com/hourglas/p/15072776.html