关于Java多线程的理解

来源:互联网 发布:美白牙齿知乎 编辑:程序博客网 时间:2024/05/20 18:16

进程是系统资源分配的基本单位,而线程则是CPU调度的基本单位

当我们在电脑打开一个程序的时候,我们的操作系统就需要为这个程序分配资源(内存、IO、CPU的计算资源等)这就是创建了一个线程。进程的创建是为了其内部的线程运行提供环境线程则是里面一个个运行执行的程序,如当你进行多人进行QQ聊天的时候,每一个聊天的对象就可以看作是一个单独的线程。线程之间的通信在内部就可以很简单的完成如转发消息到另一个人。而不同的进程是相互隔离的,通信的话需要通过操作系统。就像把记事本里的文字复制到QQ里面一样。

理解进程和线程的概念后,说下计算机对于多线程的执行方式,我们在计算机上写的任何程序,操作最后都必然会成为一条条的顺序执行的CPU指令。CPU现在一般是个位数一般都是2、4、8这几种,而一个电脑上同一时间可不止一个程序(进程)在运行一般都是上百的数量光操作系统要运行的各类程序就有几十个。因而为了实现程序的并行。就采用了一种不断切换线程执行的方式,也就是挑选一个进程运行一段时间(这段时间又称时间片一般是毫秒级别的),然后挂起此线程并保存程序的此时的状态(又叫上下文),然后根据操作系统内部的算法挑选一个线程运行一段时间。就这样在所有的需要执行的线程反复的切换,从而使得看起来电脑是在同时运行多个的程序。因而当你开启了多个线程来执行同一个任务的时候,这就增大了CPU选中此类线程的概率从而使得任务更快的完成。

在Java中要写多线程程序,一般常用的两种方法一个是继承Thread类。一个是实现Runnable接口,接口里面就只有一个抽象方法run( )。因为Java是单继承多实现,所以最好的方式是实现Runnable接口。以防今后要对程序进行扩展。
除此原因之外Java对多线程调用的处理是采用了静态代理这一设计模式,Thread本身也实现了Runnable接口的,当我们编写的类与Thread类都实现Runnable接口,然后将我们编写类的对象作为参数传入Thread里,再调用start( )方法就创建好一条线程了。这样的好处是我们只需专心实现run( )方法也就是我们在线程被选中时候执行要执行的代码。而多线程的准备和收尾工作都交给了Thread了。

最后说下关于start( ),这个方法作用是将此线程加入到线程池,表示已经准备好等待CPU的调用了。所以在此处不能直接调用对象的run()方法,因为这样的话是表示在main这个主线程下的一个普通方法而已,因而会按顺序执行完此run()内代码。这就不是多线程了而是顺序执行。最后写个简单的示例代码

public class Test {    public static void main(String[] args)    {        TicketThread ticket = new TicketThread();        Thread t1 = new Thread(ticket,"线程1");        Thread t2 = new Thread(ticket,"线程2");        Thread t3 = new Thread(ticket,"线程3");        t1.start();        t2.start();        t3.start();    }}class TicketThread implements Runnable{    int tickets = 100;    @Override    public void run()     {        while (true)         {            if (tickets > 0)             {                String name = Thread.currentThread().getName();                System.out.println(name + "=>" + tickets--);            }        }    }}
原创粉丝点击