自己总结的,不全面,参考即可
多线程
1. Thread 类
①创建线程方式——继承Thread类
创建线程的步骤:
1 定义一个类继承Thread。
2 子类中重写run方法。
3 主方法中创建子类对象,就是创建线程对象。
4 调用start方法,开启线程并让线程执行,同时还会告诉jvm去调用run方法。
获取线程名:Thread.currentThread().getName()
②创建线程方式——实现Runnable接口
创建线程的步骤。
1、定义类实现Runnable接口。
2、覆盖接口中的run方法。。
3、创建Thread类的对象
4、将Runnable接口的子类对象作为参数传递给Thread类的构造方法。
ThreadTask task = new ThreadTask();
Thread t = new Thread(task, "新线程");
Thread t2 = new Thread(task, "新线程222");
5、调用Thread类的start方法开启线程。
sleep方法
Thread.sleep(500); //500代表睡眠500毫秒
方法写在run方法中需要处理异常(ryy....catch)
2.线程池
使用线程池中线程对象的步骤:
创建线程池对象
创建Runnable/Callable接口子类对象
提交Runnable/Callable接口子类对象
关闭线程池 //实际开发中一般省略此步
ExecutorService threadPool = Executors.newFixedThreadPool(3); //创建线程池
Task task = new Task(); //线程任务类对象
threadPool.submit(task); //获取线程池中的某个线程对象,执行线程任务操作,可以多个
//threadPool.shutdown(); //关闭线程池
Runnable接口 与 Callable接口的区别:
Runnable:
run()方法没有返回值
run()方法不能抛出异常
Callable:
call()方法有返回值
call()方法可以抛出异常 Exception
3.线程安全
①同步代码块 (主方法内容不用修改,只修改线程类)
public class Task implements Runnable{
int ticket = 100; //定义票数
Object obj = new Object(); //定义一个锁对象,可以是任意类型
@Override
public void run() { //run方法
while(true){
synchronized (s) { //同一个锁对象
if (ticket > 0) {
System.out.println(Thread.currentThread().getName() + "卖票" + ticket);
ticket--;
}
}
}
}
}
②同步方法 (主方法内容不用修改,只修改线程类)
public class Task implements Runnable{
int ticket = 100; //定义票数
@Override
public void run() { //run方法
while(true){
method(); //调用同步方法
}
}
public synchronized void method(){ //创建同步方法,方法用synchronized修饰
if (ticket > 0) {
System.out.println(Thread.currentThread().getName() + "卖票" + ticket);
ticket--;
}
}
}
③Lock接口
public class Task implements Runnable{
int ticket = 100; //定义票数
Lock ck = new ReentrantLock(); //创建锁对象
@Override
public void run() { //run方法
while(true){
ck.lock(); //上锁
if (ticket > 0) {
System.out.println(Thread.currentThread().getName() + "卖票" + ticket);
ticket--;
}
ck.unlock(); //解锁
}
}
} |
|