多线程入门

简介: 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();
    }
}

 

相关文章
|
11月前
|
存储 监控 Java
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
542 60
【Java并发】【线程池】带你从0-1入门线程池
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
算法 NoSQL Java
Springboot3新特性:GraalVM Native Image Support和虚拟线程(从入门到精通)
这篇文章介绍了Spring Boot 3中GraalVM Native Image Support的新特性,提供了将Spring Boot Web项目转换为可执行文件的步骤,并探讨了虚拟线程在Spring Boot中的使用,包括如何配置和启动虚拟线程支持。
1129 9
Springboot3新特性:GraalVM Native Image Support和虚拟线程(从入门到精通)
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
154 1
|
Java 数据处理 开发者
Java多线程编程的艺术:从入门到精通####
【10月更文挑战第21天】 本文将深入探讨Java多线程编程的核心概念,通过生动实例和实用技巧,引导读者从基础认知迈向高效并发编程的殿堂。我们将一起揭开线程管理的神秘面纱,掌握同步机制的精髓,并学习如何在实际项目中灵活运用这些知识,以提升应用性能与响应速度。 ####
158 3
Java中的多线程编程:从入门到精通
本文将带你深入了解Java中的多线程编程。我们将从基础概念开始,逐步深入探讨线程的创建、启动、同步和通信等关键知识点。通过阅读本文,你将能够掌握Java多线程编程的基本技能,为进一步学习和应用打下坚实的基础。
|
安全 Java 调度
「Python入门」Python多线程
1. **线程与进程区别**:线程共享内存,进程独立;线程启动快,多线程效率高于多进程。 2. **多线程使用**:直接使用Thread类,通过`target`指定函数,`args`传递参数;或继承Thread,重写`run`方法。 3. **守护线程**:设置`setDaemon(True)`,主线程结束时,守护线程一同结束。 4. **join线程同步**:主线程等待子线程完成,如`t.join()`。 5. **线程锁**(Mutex):防止数据竞争,确保同一时间只有一个线程访问共享资源。 6. **RLock(递归锁)**:允许多次锁定,用于需要多次加锁的递归操作。
148 1
「Python入门」Python多线程
|
安全 数据库连接 API
C#一分钟浅谈:多线程编程入门
在现代软件开发中,多线程编程对于提升程序响应性和执行效率至关重要。本文从基础概念入手,详细探讨了C#中的多线程技术,包括线程创建、管理及常见问题的解决策略,如线程安全、死锁和资源泄露等,并通过具体示例帮助读者理解和应用这些技巧,适合初学者快速掌握C#多线程编程。
250 0
|
Java 数据处理 调度
Java多线程编程入门指南
Java多线程编程入门指南

热门文章

最新文章