Java进程与线程

  • 1、java支持多线程
  • 2、Thread类实现多线程
  • 3、总结


1、java支持多线程

Java语言最大的特点就是支持多线程的开发,也是为数不多支持多线程的编程语言。

在传统的DOS系统中,其本身有一个特征:如果你电脑上出现了病毒,那么所有的程序将无法执行,因为传统的DOS采用的是单进程处理,而单进程处理的最大特点:在同一个时间段上只允许一个程序执行。
在windows时代就开启了多进程的设计,表示在一个时间段上可以同时运行多个程序,并且程序将进行资源的轮流抢占。在同一个时间段上会有多个程序依次执行,但是在同一个时间点上只会有一个进程执行,后来到了多核的CPU,由于可以处理的CPU多了,那么即便有再多的进程出现,也会比单核处理的速度快。
线程是进程基础之上划分的更小的程序单元,线程是在进程基础上创建并使用的,所以线程依赖于进程的支持,但是线程的启动速度比进程快,所以当使用进程进行并发处理的时候,其执行的性能要高于进程。

Java是多线的编程语言,所以Java在进行并发访问处理的时候可以得到更高的处理性能。

2、Thread类实现多线程

如果要想在Java之中实现多线程的定义,那么就需要有一个专门的线程主体类进行线程的执行任务的定义,而这个主体类的定义是有要求的,必须实现特定的接口或者继承特定的父类才可以完成。
继承Thread类实现多线程
Java里面提供有一个java.lang.Thread的程序类,那么一个类只要继承了此类就表示这个类为线程的主体类,但是并不是这个类就可以直接实现多线程处理了,因为还需要覆写Thread类中提供的一个run()方法,而这个方法就属于线程的主方法,主方法没有返回值。多线程要执行的功能都应该在run()方法中定义,需要说明的是:在正常情况下,如果要想使用一个类中的方法,肯定要产生实例化对象,而后去调用类中提供的方法,但是run()方法是不能直接被调用的,因为这里牵扯到操作系统中资源调度问题,所以要想启动多线程必须使用start()方法来完成。
实例:多线程启动

class MyThread extends Thread{ // 线程的主体类
	private String title;
	public MyThread(String title){
		this.title = title;
	}
	
	@Override
	public void run(){ // 线程的主体方法
		for(int x=0;x<10;x++){
			System.out.printIn(this.title+"运行.x= "+x);
		}
	}
}
public class ThreadDemo{
	public static void main(String[] args){
		new MyThread("线程A").start();
		new MyThread("线程B").start();
		new MyThread("线程C").start();
// 执行结果:ABC线程交替执行,并不是A线程执行完后、B线程再执行、C线程再执行
	}
}

程序分析:虽然调用的是start方法,但是最终执行的是run()方法,并且所有的线程对象都是交替执行的。
面试与笔试:为什么多线的启动不直接使用run()方法而必须使用Thread类中的start()方法呢?
结合源码分析如下:

public synchronized void start() {
        if (threadStatus != 0)
//抛出了一个异常,每个线程对象只允许启动一次。
      	 throw new IllegalThreadStateException ();  
       	group.add(this);
       	boolean started = false;
        try {
            start0(); // 在start()方法里面调用了start0()方法
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
            
            }
        }
    }
private native void start0(); // 只定义了方法名称,但是没有实现

程序解析:在start()方法里面会抛出一个” IllegalThreadStateException”异常类对象,但是整个的程序并没有使用throws或者说是try…catch处理,因为该异常是RuntimeException的子类;每一个线程类的对象只允许启动一次,如果重复启动则就抛出此异常。
使用了start0()方法的分析:
在Java程序执行之中的过程之中考虑到对于不同层次开发者的需求,所以其支持有本地的操作系统函数调用,而这项技术就被称为JNI技术,(Java Native Interface)Java本地接口。利用这项技术可以使用一些操作系统提供的底层函数进行一些特殊的处理,而在Thread类中提供的start0()就表示需要将此方法依赖于不同的操作系统实现。
Thread的执行分析如下图所示:

java是支持多线程吗 java只支持单线程吗_java

3、总结

任何情况下,只要定义了多线程,多线程的启动永远只有一种方案:Thrad类中的start()方法。