线程的学习及使用

目的:
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();

结果:

image.png

小结:
概念部分有点多,不过还好理解得了。锁的应用着实有点头痛。数据的回调也还好。还行!

你可能感兴趣的:(线程的学习及使用)