目的:
1.了解并掌握进程和线程的概念
2.学习线程相关函数的使用方法
3.学会定义和调用线程
4.使用接口实现主线程和子线程的数据回调
相关概念:
进程:正在运行的一个程序就是一个进程(QQ IDE 浏览器)
- 系统会为这个进程分配独立的内存资源
- 线程:具体执行任务的最小单位
- 一个进程最少拥有一个线程(主线程 运行起来就执行的线程)
- 线程之间是共享内存资源的(进程申请的)
- 线程之间可以通信(数据传递:多数为主线程和子线程)
- 每一个线程都有自己的运行回路(生命周期)
具体实现:
创建子线程:
class TestThread extends Thread{
//实现run方法
//方法里面就是具体需要执行的代码
String name =Thread.currentThread().getName();
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
System.out.println(name +":"+i);
}
super.run();
}
}
调用:
TestThread tt = new TestThread();
//设置线程的名称
tt.setName("子线程1");
//开启任务
tt.start();
利用线程模拟编写一个出票过程:
class Test11 implements Runnable{
static int num=100;
String name;
static final Object obj =new Object();
public Test11(String name){
this.name=name;
}
@Override
public void run() {
String n = Thread.currentThread().getName();
System.out.println(n);
for (int i = 1; i <=100; i++) {
synchronized(obj){
if(num>0&&num<=100){
System.out.println(name+"出票:"+(101-num));
num--;obj.notify();
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
调用:
public static void main(String[] args){
String n = Thread.currentThread().getName();
System.out.println(n);
Test11 t1 = new Test11("重庆");
Thread tk1 = new Thread(t1);
tk1.start();
Test11 t2 = new Test11("上海");
Thread tk2 = new Thread(t2);
tk2.start();
}
实现主线程和子线程数据回调:
子线程:
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 Person11 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);
}
}
调用:
Person11 pj=new Person11();
pj.needHouse();
结果:
小结:
概念部分有点多,不过还好理解得了。锁的应用着实有点头痛。数据的回调也还好。还行!