微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java多线程是什么

本篇文章将介绍一下多线程和其实例。

Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每用java命令启动一个java应用程 序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线 程来运行。

一般常见的Java应用程序都是单线程的。比如,用java命令运行一个最简单的HelloWorld的Java应用程序时,就启动了一个JVM进 程,JVM找到程序程序的入口点main(),然后运行main()方法,这样就产生了一个线程,这个线程称之为主线程。当main方法结束后,主线程运行完成。JVM进程也随即退出

对于一个进程中的多个线程来说,多个线程共享进程的内存块,当有新的线程产生的时候,操作系统不分配新的内存,而是让新线程共享原有的进程块的内存。因此,线程间的通信很容易,速度也很快。不同的进程因为处于不同的内存块,因此进程之间的通信相对困难。

推荐课程:Java教程

进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。

线程是指进程中的一个执行流程,一个进程可以运行多个线程。比如java.exe进程可以运行很多线程。线程总是输入某个进程,进程中的多个线程共享进程的内存。

多线程指的是这个程序(一个进程)运行时产生了不止一个线程

实例

线程1:接下来使用实现Runnable实现多线程的方法:。

public class TestRunnable implements Runnable {

    private int time=1;
    private SourceA s;
    private String id = 001;
    public TestRunnable(SourceA s){
        this.s = s;
    }
    public void setTime(int time) {
        this.time = time;
    }
    
    @Override
    public void run() {
        try {
            System.out.println(i will sleep+ time);
            Thread.sleep(time);
        } catch (InterruptedException e) {
            e.printstacktrace();
        }

        synchronized(s){
            s.notify();
            System.out.println(我唤醒了002!);
            System.out.println(我存入了id+id);
            s.setSource(id);
        }
    }

}

线程2:接下来使用继承Thread实现多线程的方法:。

public class TestThread extends Thread {
    private int time = 1;
    private SourceA s = null;
    String id = 002;
    
    public void setTime(int time) {
        this.time = time;
    }
    
    public TestThread(SourceA s){
        this.s = s ;
    }
    
    @Override
    public void run() {
        try {
            System.out.println(i will sleep+ time);
            sleep(time);
        } catch (InterruptedException e) {
            // Todo Auto-generated catch block
            e.printstacktrace();
        }
        
        synchronized(s){
            try {
                System.out.println(我+ id +要进行等待了);
                s.wait();
            } catch (InterruptedException e) {
                // Todo Auto-generated catch block
                e.printstacktrace();
            }
            System.out.println(我被唤醒了);
            System.out.println(我存入了id+id);
            s.setSource(id);
        }
    }

}

将线程进行同步的类,有get、set方法

public class SourceA {
    private List<String> list = new ArrayList<String>();
    public synchronized void getSource(){
        for(int i=0;i<list.size();i++){
            System.out.println(list.get(i));
        }
    }
    public synchronized void setSource(String id){
        list.add(id);
    }
}

测试类,将多线程结果打印到控制台中。

public void test(){
        SourceA s = new SourceA();
        TestThread tt = new TestThread(s);
        TestRunnable tr = new TestRunnable(s);
        Thread t = new Thread(tr);
        System.out.println(调用线程1);
        tt.start();
        System.out.println(调用线程2);
        t.start();
    }

原文地址:https://www.jb51.cc/java/1192294.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐