多线程入门

简介: 1.创建线程(1)第一种方式就是直接继承Thread这个类,这个类其实是实现了Runnable这个接口,只不过没有显示的声明出来,不过你要是直接继承这个类,你需要去自己写一个run的方法,这个方法里写你的多线程逻辑。

1.创建线程

(1)第一种方式就是直接继承Thread这个类,这个类其实是实现了Runnable这个接口,只不过没有显示的声明出来,

不过你要是直接继承这个类,你需要去自己写一个run的方法,这个方法里写你的多线程逻辑。

public class CreateThreadbyExtendsTh {
    public static void main(String[] args){
        System.out.println("main Thread......");
        Thread t1 = new Thread1("TTT1");
        Thread t2 = new Thread2("TTT2");
        t1.start();t2.start();
    }
}
class Thread1 extends Thread {
    Thread1 (String str) {
        super(str);
    }
    public void run() {
        for (int i = 1; i <= 10; i++) {
            System.out.println(this.getName()+" "+i+"\t");
        }
    }
}
class Thread2 extends Thread {
    Thread2 (String str) {
        super(str);
    }
    public void run() {
        for (int i = -100; i <=-90 ; i++) {
            System.out.println(this.getName()+"aaa"+i+"\t");
        }
    }
}

(2)第二种方式就是你的类实现Runnable这个接口,如果你去实现了这个接口,那么意味着这个接口里的方法你也要去实现了

就是run的方法,这个run方法里你可以去写你的多线程逻辑,最后只需要把你这个实现了Runnnable这个接口的类的对象传到

Thread这个构造方法里就可以了。

public class CreateThreadbyRunnable {
    public static void main(String[] args){
        System.out.println("main thread......");
        MyTask myTask = new MyTask(10);
        Thread thread = new Thread(myTask);
        thread.start();
        for (char ch = 'a'; ch <= 'k'; ch++) {
            System.out.print(" "+ch+"       ");
        }
    }
}
class MyTask implements Runnable {
    private int n;
    public MyTask(int n){
        this.n = n;
    }

    @Override
    public void run() {
        for (int i = 0; i < n; i++) {
            System.out.print(" "+i);
        }
    }
}

2.值得注意的是我们还要关注sleep这个方法,这个方法是使线程休眠的方法,从而执行多个线程:

import java.text.SimpleDateFormat;
import java.util.Date;
public class TestThread3 {
    public static void main(String[] args) {
        Runner r1 = new Runner("Parameter1");
        Thread t1 = new Thread(r1);
        Thread t2 = new Thread(r1);
        Thread t3 = new Thread(r1);
        Runner r2 = new Runner("Parameter2");
        Thread t4 = new Thread(r2);
        Thread t5 = new Thread(r2);
        Thread t6 = new Thread(r2);
        Timer timer = new Timer();
        Thread t7 = new Thread(timer);
        t1.setName("t1");
        t2.setName("t2");t3.setName("t3");t4.setName("t4");
        t5.setName("t5");t6.setName("t6");t7.setName("t7");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t5.start();
        t6.start();
        t7.start();
    }
}
class Runner implements Runnable {
    String para;
    Runner(String para){
        this.para = para;
    }

    @Override
    public void run() {
        int i = 0;
        while (i < 20){
            i++;
            System.out.print("para: "+para+" ");
            System.out.println(Thread.currentThread().getName()+"No."+i);
            try {
                Thread.sleep(100);//使线程休眠,使其它线程有得到CPU的机会
            } catch (InterruptedException e){}
        }
    }
}
class Timer implements Runnable {

    @Override
    public void run() {
        for (int i = 1; i <3 ; i++) {
            System.out.print(Thread.currentThread().getName());
            System.out.println(" "+new SimpleDateFormat("yyyy-MM-dd").format( new Date( )));
            try {
                    Thread.sleep(300);
            } catch (InterruptedException e) {}
        }
    }
}

3.还有一个关键字wait()是使线程暂停的,而notify()是使线程恢复的,synchronized这个关键字是使线程同步的,设置了这个关键字意味着多个线程不同时访问临界资源,只能被一个线程独立的占用,其它线程阻塞。

public class Basket {
    int index = 0;
    Apple[] apples = new Apple[5];
    public synchronized void push(Apple apple) {
        while (index == apples.length) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.notifyAll();
        apples[index] = apple;
        index ++;
    }
    public synchronized Apple pop() {
        while (index == 0) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.notifyAll();
        index--;
        return apples[index];
    }
}

4.还有一个关键方法就是join()这个方法是使正在运行的线程暂停下来:

public class TestJoin {
    public static void main(String[] args) {
        MyThread2 t1 = new MyThread2("MyThread");
        t1.start();
        try {
            t1.join();
        } catch (InterruptedException e) {}
            for (int i = 1; i <=5 ; i++) {
                System.out.println("i am main thread");
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e){}
            }
    }
}
class  MyThread2 extends Thread {
    MyThread2(String s) {
        super(s);
    }

    @Override
    public void run() {
        for (int i = 1; i <= 5 ; i++) {
            System.out.println("i am "+getName());
            try {
                sleep(200);
            } catch (InterruptedException e) { }
        }
    }
}

5.这个yield()方法是为了切换线程的切换后按优先级执行

6.综合就是生产者---消费者模式:

public class Apple {
    int id;//用id标识一个苹果
    Apple(int id) {
        this.id = id;
    }
    public String toString() {
        return  "apple : "+id;
    }
}
public class Basket {
    int index = 0;
    Apple[] apples = new Apple[5];
    public synchronized void push(Apple apple) {
        while (index == apples.length) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.notifyAll();
        apples[index] = apple;
        index ++;
    }
    public synchronized Apple pop() {
        while (index == 0) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.notifyAll();
        index--;
        return apples[index];
    }
}
public class Consumer implements Runnable {
    Basket basket = null;
    Consumer(Basket basket) {
        this.basket = basket;
    }
    @Override
    public void run() {
        for (int i = 0; i <5 ; i++) {
            Apple apple = basket.pop();
            System.out.println(Thread.currentThread().getName()+"消费了:" + apple);
            try {
                Thread.sleep((int)(Math.random() * 300));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class Producer implements Runnable {
    Basket basket = null;
    Producer(Basket basket) {
        this.basket = basket;
    }
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            Apple apple = new Apple(i);
            System.out.println(Thread.currentThread().getName()+"生产了:" + apple);
            basket.push(apple);
            try {
                Thread.sleep((int)(Math.random() * 100));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class ProducerAndConsumer {
    public static void main(String[] args) {
        Basket basket = new Basket();
        Producer p = new Producer(basket);
        Consumer c = new Consumer(basket);
        Thread t1 = new Thread(p);
        t1.setName("生产者1 ");
        t1.start();
        Thread t2 = new Thread(c);
        t2.setName("消费者1 ");
        Thread t3 = new Thread(c);
        t3.setName("消费者2 ");
        t3.start();
    }
}

 

相关文章
|
6月前
|
存储 Java 调度
从零开始学习 Java:简单易懂的入门指南之线程池(三十六)
从零开始学习 Java:简单易懂的入门指南之线程池(三十六)
|
7天前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
26天前
|
算法 NoSQL Java
Springboot3新特性:GraalVM Native Image Support和虚拟线程(从入门到精通)
这篇文章介绍了Spring Boot 3中GraalVM Native Image Support的新特性,提供了将Spring Boot Web项目转换为可执行文件的步骤,并探讨了虚拟线程在Spring Boot中的使用,包括如何配置和启动虚拟线程支持。
58 9
Springboot3新特性:GraalVM Native Image Support和虚拟线程(从入门到精通)
|
4天前
|
Java 数据处理 开发者
Java多线程编程的艺术:从入门到精通####
【10月更文挑战第21天】 本文将深入探讨Java多线程编程的核心概念,通过生动实例和实用技巧,引导读者从基础认知迈向高效并发编程的殿堂。我们将一起揭开线程管理的神秘面纱,掌握同步机制的精髓,并学习如何在实际项目中灵活运用这些知识,以提升应用性能与响应速度。 ####
19 3
|
5天前
|
Java
Java中的多线程编程:从入门到精通
本文将带你深入了解Java中的多线程编程。我们将从基础概念开始,逐步深入探讨线程的创建、启动、同步和通信等关键知识点。通过阅读本文,你将能够掌握Java多线程编程的基本技能,为进一步学习和应用打下坚实的基础。
|
2月前
|
安全 数据库连接 API
C#一分钟浅谈:多线程编程入门
在现代软件开发中,多线程编程对于提升程序响应性和执行效率至关重要。本文从基础概念入手,详细探讨了C#中的多线程技术,包括线程创建、管理及常见问题的解决策略,如线程安全、死锁和资源泄露等,并通过具体示例帮助读者理解和应用这些技巧,适合初学者快速掌握C#多线程编程。
74 0
|
3月前
|
机器学习/深度学习 Java TensorFlow
深度学习中的图像识别:从理论到实践Java中的多线程编程入门指南
【8月更文挑战第29天】本文将深入探讨深度学习在图像识别领域的应用,从基础理论到实际应用案例,带领读者一步步理解如何利用深度学习技术进行图像识别。我们将通过一个简单的代码示例,展示如何使用Python和TensorFlow库实现一个基本的图像识别模型。无论你是初学者还是有一定经验的开发者,都能从中获得启发和学习。 【8月更文挑战第29天】在Java世界里,线程是程序执行的最小单元,而多线程则是提高程序效率和响应性的关键武器。本文将深入浅出地引导你理解Java多线程的核心概念、创建方法以及同步机制,帮助你解锁并发编程的大门。
|
5月前
|
Java 数据处理 调度
Java多线程编程入门指南
Java多线程编程入门指南
|
5月前
|
Java 开发者
告别单线程时代!Java 多线程入门:选继承 Thread 还是 Runnable?
【6月更文挑战第19天】在Java中,面对多任务需求时,开发者可以选择继承`Thread`或实现`Runnable`接口来创建线程。`Thread`继承直接但限制了单继承,而`Runnable`接口提供多实现的灵活性和资源共享。多线程能提升CPU利用率,适用于并发处理和提高响应速度,如在网络服务器中并发处理请求,增强程序性能。不论是选择哪种方式,都是迈向高效编程的重要一步。
41 2
|
5月前
|
监控 程序员 调度
协程实现单线程并发(入门)
协程实现单线程并发(入门)
56 1

相关课程

更多