多线程!

来源:互联网 发布:人类永生不死知乎 编辑:程序博客网 时间:2024/06/08 09:16

1.线程

      线程是指程序在执行过程中,能够执行程序代码的一个执行单元。线程有四种状态:运行、就绪、挂起、结束。
      使用多线程可以为程序带来很大的便利。1.使用多线程可以减少程序的响应时间。2.与进程相比,线程的创建与开销更小。3.多CPU或多核计算机本身就具有执行多线程的能力。4.使用多线程能简化程序的结构,使程序便于理解与维护。

2.同步与异步的区别。

     在多线程的环境中,经常会遇到数据共享问题,当多个线程需要范文同一个资源时,它们需要以某种顺序来确保资源在某一时刻只能被一个线程使用。在这种时候就需要对数据进行同步。要实现同步,就必须获得每一个线程对象获得锁。同步的实现方式有两种:1.利用同步代码块来实现同步。2.利用同步方法实现同步。
     异步与非阻塞类似,由于每个线程都包含了运行时自身所需要的数据或方法,因此在进行输入输出处理时,不必关心其他线程的状态或行为,也不必等到输入输出处理完毕才返回。

3.java实现多线程

     (1.)继承Thread,重写run()方法
           Thread本质上也是实现了Runnable接口。通过start()方法启动。strat()方法是一个native方法,它将启动一个新线程,并执行run()方法。调用start()放啊后并不是立即执行多线程代码,而是使得该线程变为可运行状态,什么时候运行多线程代码是由操作系统决定的。
          1、继承Thread类创建线程:

                   class 类名 extends Thread{

                        public void run(){

                           //相关代码

                        }

                   }

      (2.)实现Runnable接口,实现接口的run()方法

           自定义类并实现Runnable接口,实现run()方法。创建Thread对象,用实现Runnable接口的对象作为参数实例化该Thread对象。调用Thread的start()方法。

           2、实现Runnable接口:

                   class  MyThread implements Runnable{

                        public void run(){

                                System.out.println("1");

                        }

                   }

                 public class Test {

         public static void main(String[] args) {

MyThread thread = new MyThread();

Thread t = new Thread(thread);
t.start();
     }

         }

       (3.)实现Callable接口,重写call()接口。

            Callable接口是属于Executor框架中的功能类,Callable接口与Runnable接口的功能类似,但提供了比Runnable更强大的功能。1.Callable可以在任务结束后提供一个返回值,Runnable无法提供这个功能。2.Callable中call()方法可以抛出异常,erRunnable的run()方法不能抛出异常。3.运行Callable可以拿到一个Future对象,Future对象表示异步的计算结果,它提供了检查计算是否完成的方法。

         public class Callable{
public static class CallableT implements java.util.concurrent.Callable<String>{
public String call() throws Exception{
return "12";
}
}
public static void main(String[] args) {
ExecutorService thread = Executors.newSingleThreadExecutor();
Future<String> future = thread.submit(new CallableT());
try {
System.out.println("123");
System.out.println(future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}


4.run()方法和start()方法的区别

      start()方法能够异步的调用run()方法,但是直接调用run()方法确实同步的,不能到达多线程的目的。
从运行的结果可以看出。线程t1是在test1方法结束之后才执行的。因此test1中调用strat()方法是异步。而调用run()方法是同步调用方法。

           

原创粉丝点击