白骑士的Java教学Java核心类库 4.5 多线程编程

        欢迎来到Java核心类库的学习篇!在前面的章节中,我们探讨了字符串处理、常用数据结构、异常处理机制和输入输出操作的相关知识。在本节中,我们将深入了解Java的多线程编程。多线程编程是一种在程序中并发执行多个线程的方法,它能够显著提高程序的执行效率和响应速度。通过学习Java的多线程机制,你将掌握如何编写并发程序,管理线程的生命周期,并实现线程间的协调和通信。

线程的基本概念

        线程是程序执行的最小单位,每个线程都有自己的执行路径。Java通过‘java.lang.Thread‘类和‘java.lang.Runnable‘接口来实现多线程编程。

什么是进程和线程

  • 进程:操作系统中独立运行的程序,每个进程有自己的内存空间和系统资源。
  • 线程:进程中的独立执行路径,同一进程中的线程共享内存空间和系统资源。

创建线程

        在Java中,可以通过继承‘Thread‘类或实现‘Runnable‘接口来创建线程。

继承Thread类

        示例:

public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
    }
}


class MyThread extends Thread {
    @Override

    public void run() {
        System.out.println("Thread is running.");
    }
}

实现Runnable接口

        示例:

public class Main {
    public static void main(String[] args) {
        MyRunnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start();
    }
}


class MyRunnable implements Runnable {
    @Override

    public void run() {
        System.out.println("Thread is running.");
    }
}

线程的生命周期

        线程的生命周期包括以下几个阶段:

  • 新建(New):线程对象被创建,但尚未启动。
  • 就绪(Runnable):线程已启动,等待CPU分配时间片。
  • 运行(Running):线程正在执行。
  • 阻塞(Blocked):线程因等待某个条件而暂停执行,如等待I/O操作或获取锁。
  • 终止(Terminated):线程执行完毕或因异常退出。

线程的优先级

        每个线程都有一个优先级,Java提供了从‘Thread.MIN_PRIORITY‘(1)到‘Thread.MAX_PRIORITY‘(10)的10个优先级。线程的默认优先级为‘Thread.NORM_PRIORITY‘(5)。

        示例:

public class Main {
    public static void main(String[] args) {
        Thread thread1 = new Thread(new MyRunnable());
        thread1.setPriority(Thread.MAX_PRIORITY);
        
        Thread thread2 = new Thread(new MyRunnable());
        thread2.setPriority(Thread.MIN_PRIORITY);
        
        thread1.start();
        thread2.start();
    }
}


class MyRunnable implements Runnable {
    @Override

    public void run() {
        System.out.println("Thread is running with priority: " + Thread.currentThread().getPriority());
    }
}

线程同步

        线程同步用于防止多个线程同时访问共享资源,导致数据不一致。Java提供了‘synchronized‘关键字来实现线程同步。

同步方法

        示例:

public class Main {
    public static void main(String[] args) {
        Counter counter = new Counter();

        Thread thread1 = new Thread(new MyRunnable(counter));
        Thread thread2 = new Thread(new MyRunnable(counter));
        
        thread1.start();
        thread2.start();
    }
}


class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
        System.out.println("Count: " + count);
    }
}


class MyRunnable implements Runnable {
    private Counter counter;

    public MyRunnable(Counter counter) {
        this.counter = counter;
    }

    @Override

    public void run() {
        for (int i = 0; i < 10; i++) {
            counter.increment();
        }
    }
}

同步块

        示例:

public class Main {
    public static void main(String[] args) {
        Counter counter = new Counter();

        Thread thread1 = new Thread(new MyRunnable(counter));
        Thread thread2 = new Thread(new MyRunnable(counter));
        
        thread1.start();
        thread2.start();
    }
}


class Counter {
    private int count = 0;
    
    public void increment() {
        synchronized (this) {
            count++;
            System.out.println("Count: " + count);
        }
    }
}


class MyRunnable implements Runnable {
    private Counter counter;

    public MyRunnable(Counter counter) {
        this.counter = counter;
    }

    @Override

    public void run() {
        for (int i = 0; i < 10; i++) {
            counter.increment();
        }
    }
}

线程通信

        Java提供了‘wait()‘、‘notify()‘和‘notifyAll()‘方法来实现线程间的通信。

        示例:

public class Main {
    public static void main(String[] args) {
        Message message = new Message();

        Thread thread1 = new Thread(new Producer(message));
        Thread thread2 = new Thread(new Consumer(message));
        
        thread1.start();
        thread2.start();
    }
}


class Message {
    private String content;
    private boolean empty = true;

    public synchronized void produce(String content) {
        while (!empty) {
            try {
                wait();
            } 

            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        empty = false;
        this.content = content;
        System.out.println("Produced: " + content);
        notifyAll();
    }

    public synchronized String consume() {
        while (empty) {
            try {
                wait();
            } 

            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        empty = true;
        System.out.println("Consumed: " + content);
        notifyAll();
        return content;
    }
}


class Producer implements Runnable {
    private Message message;

    public Producer(Message message) {
        this.message = message;
    }

    @Override

    public void run() {
        String[] contents = {"message1", "message2", "message3"};

        for (String content : contents) {
            message.produce(content);

            try {
                Thread.sleep(500);
            } 

            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}


class Consumer implements Runnable {
    private Message message;

    public Consumer(Message message) {
        this.message = message;
    }

    @Override

    public void run() {
        for (int i = 0; i < 3; i++) {
            message.consume();

            try {
                Thread.sleep(1000);
            } 

            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

总结

        在本篇博客中,我们详细介绍了Java的多线程编程。从线程的基本概念、创建线程的方法、线程的生命周期和优先级,到线程同步和线程通信,通过这些知识的学习,你将能够编写并发程序,管理线程的生命周期,并实现线程间的协调和通信。多线程编程是Java编程中非常重要的一部分,掌握这些技巧能够帮助你开发高效且响应迅速的应用程序。在接下来的学习中,我们将继续探讨Java核心类库中的其他重要内容,帮助你全面掌握Java编程技能。祝你学习愉快,不断进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白骑士所长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值