一、目的
1.了解多线程是什么
2.学习多线程怎么用
二、知识点
1.线程、进程概念与区别、使用子线程的意义
2.创建线程的两种方法
第一种方式:使用继承Thread
创建一个线程
创建另一个线程
第二种方式:实现Runnable接口
实现Rannable方法 实现run方法
*特点:
a.创建任务 创建类实现Runnable接口
b.使用Thread 为这个任务分配线程
c.开启任务 start
使用方式1:
//1.
//创建一个任务:创建一个类实现Runnable接口
PXDTestThread pt = new PXDTestThread();
//使用Thread操作这个任务
Thread t = new Thread(pt);
t.setName("子线程1");
t.start();
Thread t2 = new Thread(pt);
t2.setName("子线程1");
t2.start();
使用方式2:
//适用于这个任务只执行一次
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread());
}
});
使用方式3:
//创建线程的同时 直接开启线程任务
//不需要操作
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread());
}
}).start();
使用方式4:
//不建议 :因为阅读性差
new Thread(()->{
System.out.println(Thread.currentThread());
}).start();
3.多线程的同步控制 synchronized Reet
4.主线程和子线程之间使用接口回调数据
5.线程间的通信
^1.synchronized(wait notify notifiall)
^2.ReentrantLock Lock;
Condition c = Lock.newCondition(); (await single singleall)
三、实际运用:1.卖火车票(多线程的同步控制)|2.中介找房
public static void main(String[] args){
//
Ticket ticket = new Ticket("重庆");
Thread t1 = new Thread(ticket);
t1.start();
Ticket ticket2 = new Ticket("上海");
Thread t2 = new Thread(ticket2);
t2.start();
}
}
//用于买票的任务
class Ticket implements Runnable {
//定义所以车票的数量
public static int num = 100;
String name;
public Ticket(String name) {
this.name = name;
}
static final Object obj = new Object();//用任意一个对象来实现加锁,但要保证是同一对象,所以要用static
//创建一个可以重新载入的锁//3
static ReentrantLock Lock = new ReentrantLock();
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
//判断有没有票
//synchronized (obj) {//1
//加锁//3
Lock.lock();
if (num > 0) {
System.out.println(name + "出票:" + num);
num--;
// try {
// notify();
// wait();
// } catch (InterruptedException e) {
// e.printStackTrace();
// }finally {
// //通知其他线程执行
//
// }
} else {
break;
}
//解锁//3
Lock.unlock();
//}//1
}
}
public class Agent extends Thread{
AgentInterface target;
@Override
public void run() {
System.out.println("开始找房子");
System.out.println("---------");
System.out.println("房子找到了 即将返回数据");
target.callBack("房子在西南大学");
super.run();
}
public interface AgentInterface{
void callBack(String desc);
}
}
public class Person implements Agent.AgentInterface {
public void needHouse(){
Agent xw = new Agent();
xw.target = this; //表明返回数据给调用者
xw.start();
}
@Override
public void callBack(String desc) {
System.out.println("我是小王,接受到你的数据"+desc);
}
}
MyClass类
/**
* 使用接口实现线程之间数据回调
* Person类
* 线程里面 Agent类
*/
Person person = new Person();
person.needHouse();
四、心得
学的没有忘得快,果然还是要多写代码,没有什么比在使用中去记忆更好了,明天就复习一下前面的代码吧,回过头去看会有原来如此的感觉,理解也能比较透彻一些吧。