进程:正在运行的程序,是系统进行资源分配和调用的独立单位。 每一个进程都有它自己的内存空间和系统资源。 线程:是进程中的单个顺序控制流,是一条执行路径; 一个进程如果只有一条执行路径,则称为单线程程序。 一个进程如果有多条执行路径,则称为多线程程序。
由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来。而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程。但是,Java语言是不能直接调用系统功能的,所以,我们没有办法直接实现多线程程序。只能去调用C/C++写好的程序来实现多线程程序。而又由C/C++去调用系统功能创建进程,然后由Java去调用这样的东西,然后提供一些类供我们使用。我们就可以实现多线程程序了。 Java提供了三种实现方式,下面我们来一一讲解。
1.自定义一个类,继承自Thread类; 2.在这个类中重写Thread类中的run()方法; 3.在主线中开启子线程main线程; 3.1创建自定义线程类对象; 3.2使用线程类对象调用run()方法还有start()方法;
首先自定义一个类MyThread,继承自Thread类。提供了一个方法run()。
public class MyThread extends Thread { public void run() { for(int x = 0 ; x < 100;x ++) { System.out.println(x); } } }定义一个测试类,创建对象“a”分别去启动线程,调用上面的方法run()。
public class Test { public static void main(String[] args) { MyThread a = new MyThread(); a.start(); a.run(); } }实现步骤: 1.自定义一个类,实现 Runnable接口 (资源类); 2.实现接口中提供的功能:public abstract void run(); 3.在用户线程main中创建资源类对象,创建Thread类对象,将对象作为参数传递,分别启动线程。
public class MyRunnable implements Runnable{ @Override public void run() { for(int x = 0 ; x < 100 ; x++) { //使用Thread.currentThread()--->正在运行的线程 System.out.println(Thread.currentThread().getName()+":"+x); } } } public class Test { public static void main(String[] args) { //创建资源类对象 MyRunnable my = new MyRunnable(); //创建线程类对象 Thread t1 = new Thread(my); Thread t2 = new Thread(my); //给线程设置一个名称 t1.setName("简自豪"); t2.setName("明"); //分别启动线程 t1.start(); t2.start(); } }实现步骤: 此处我们需要借助Executors工具类提供的newFiexdThreadPool(int nThreads)方法; 1.创建线程池对象: S pool = Executors.newFiexdThreadPool(int nThreads){}; 2.提交异步任务 submit(Callable call); 实现Callable:接口 ; 3.关闭资源;
import java.util.concurrent.Callable; public class MyCallable implements Callable { @Override public Object call() throws Exception { for(int x = 0 ; x < 100 ; x ++) { System.out.println(Thread.currentThread().getName()+":"+x); } return null; } } public class ExecutorServiceDemo { public static void main(String[] args) { //1)创建线程池对象 ExecutorService pool = Executors.newFixedThreadPool(2) ; //2)提交异步任务 pool.submit(new MyCallable()) ; pool.submit(new MyCallable()) ; //3)关闭资源 pool.shutdown(); } }