Java 中传统多线程 4年前

编程语言
425
Java 中传统多线程

@TOC

Java 中传统多线程

线程初识

线程的概念

当代操作系统中,可以独立并发执行的基本单元 轻量:占用系统资源极少 独立:操作系统可以独立调度和分派的基本单元 共享:共享进程中的资源

实现线程

继承Thread类,重写run方法 实现Runnable接口,实现run方法

package com.xc.test.threadtest;

public class ThreadDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread threadA = new ThreadA();
        threadA.setName("ThreadA");
        threadA.start();

        ThreadB threadB = new ThreadB();
        Thread thread = new Thread(threadB);
        thread.start();

        while (true) {
            Thread.sleep(1000);
            System.out.println(3);
        }

    }
}

class ThreadA extends Thread {
    public void run() {
        while (true) {
            System.out.println(this.getName() + ":" + 2);
        }
    }
}

class ThreadB implements Runnable {
    public void run() {
        while (true) {
            System.out.println(4);
        }

    }
}

线程的生命周期

新建:线程刚刚创建完毕 可运行:启动线程后 运行:操作系统调度 阻塞/等待:等待某种资源或时间片到 消亡:退出run方法

常用API

类方法:针对当前运行线程 currentThread:获取当前运行线程的引用 yield:使得当前运行线程放弃当前时间片 sleep:使得当前运行线程休眠多少时间(单位是毫秒)

实例方法:针对指定线程 start:启动线程 setP:设置/获取线程优先级 setName/getName:设置/获取线程名称 setD:设置/获取线程的幽灵状态

线程同步

多线程共享数据的问题

多个线程并发访问同一个数据时,容易发生数据状态不稳定 使用锁机制完成线程同步(同-协同,步-调用顺序)

package com.xc.test.threadtest;

public class SysDemo {
    public static void main(String[] args) {
        Data data = new Data();
        new ThreadC(data).start();
        new ThreadC(data).start();
    }
}

class Data {
    int i;

    public void process() {
        System.out.println("Before:" + i);
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        i++;
        System.out.println("After:" + i);
    }
}

class ThreadC extends Thread {
    Data data;

    public ThreadC(Data data) {
        this.data = data;
    }

    public void run() {
        super.run();
        while (true) {
            data.process();
        }
    }
}


Before:0
Before:0
After:1
After:2
Before:2
Before:2
After:3
Before:4
After:4

线程同步及实现机制

每个类一把锁,每个对象一把锁 只有获取锁的线程可以进入同步区域

class Data {
    int i;

    public void process() {
        synchronized (this) {//对象锁(任意对象),同步块
            System.out.println("Before:" + i);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
            }
            i++;
            System.out.println("After:" + i);
        }
    }
}


class Data {
    int i;

    public synchronized void process() {//对象锁(当前对象),同步方法
        System.out.println("Before:" + i);
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
        }
        i++;
        System.out.println("After:" + i);
    }
}


Before:0
After:1
Before:1
After:2
Before:2
After:3
Before:3
After:4

线程间通讯

线程间通讯模型

wait:使当前线程进入指定对象的等待池 notify:从指定对象等待池中唤醒一个等待线程 notifyAll:从指定对象等待池中唤醒全部等待线程 只有获得该对象的锁后才可以调用上述方法

线程中通讯的实现

生产者:synchronized(obj){...;obj.notifyAll()} 消费者:synchronized(obj){obj.wait(),...;}

package com.xc.test.threadtest;

public class WnDemo {
    public static void main(String[] args) {
        Data2 data2 = new Data2();
        new Producer(data2).start();
        new Consumer(data2).start();
    }
}

class Data2 {
    int i;

    public void add() {
        synchronized (this) {
            i++;
            if (i % 5 == 0) {
                notifyAll();
            }
        }
    }

    public void sub() {
        synchronized (this) {
            try {
                this.wait();
            } catch (InterruptedException e) {
            }
        }
        System.out.println("Before:" + i);
        i++;
        System.out.println("After:" + i);
    }
}

class Consumer extends Thread {
    Data2 data;

    public Consumer(Data2 data) {
        this.data = data;
    }

    public void run() {
        while (true) {
            while (true) {
                data.sub();
            }
        }
    }
}

class Producer extends Thread {
    Data2 data;

    public Producer(Data2 data) {
        this.data = data;
    }

    public void run() {
        while (true) {
            while (true) {
                data.add();
            }
        }
    }
}
image
M狗桃央
风吹柳叶遮黄雀,薄翅不觉已落蝉。
3
发布数
1
关注者
6862
累计阅读

热门教程文档

C++
73小节
Objective-C
29小节
C
14小节
Kotlin
68小节
Flutter
105小节
广告