zoukankan      html  css  js  c++  java
  • java线程的简单实现及方法

    java线程:

    线程是一个程序内部的顺序控制流。

    cpu实际上在一个时间点上,只执行一个。只不过我们把cpu分成了多个时间片,由于速度很快,我们看起来像是多个线程。。

    就像你的时间分成几片,这样 整体看来做事情有规律,效率就会高,何况是cpu呢。

    线程的创建和启动:


     

    方法一:

    java线程通过java.lang.Thread类来实现。

    VM启动时会有一个主方法所定义的线程,

    每一个线程是Tread对象通过它的run()方法来完成操作。

    启动线程方式:Thread的start()方法。


     

    如下代码: 

    public class  TestThread
     
    {
     
    public static void main(String[] args)
     
    {
     
    Runner1 r = new Runner1();
     
    //定义线程对象。并且调用线程的构造方法。
     
    Thread t = new Thread(r);
     
    //启动线程。
     
    t.start();
     
    for(int i=0;i<100;i++)
     
    {
     
    System.out.println("Main thread-----" + i);
     
    }
     
    }
     
    }
     
    class Runner1 implements Runnable
     
    {
     
    public void run()
     
    {
     
    for (int i=1;i<100;i++)
     
    {
     
    System.out.println("Runner1" + i);
     
    }
     
    }
     
    }
    注意:
     重写(override)run()方法在该线程的start()方法被调用后,JVM会自动调用run方法来执行任务;但是重载    (overload)run()方法,该方法和普通的成员方法一样,并不会因调用该线程的start()方法而被JVM自动运行。
     

    方法二:

    定义一个Thread类的子类,重写run()方法,然后生成这个类的对象,在启动进程。

    如下代码:

    public class  TestThread
     
    {
     
    public static void main(String[] args)
     
    {
     
    Runner1 r = new Runner1();
     
    //启动线程。
     
    r.start();
     
    for(int i=0;i<100;i++)
     
    {
     
    System.out.println("Main thread-----" + i);
     
    }
     
    }
     
    }
     
    class Runner1 extends Thread
     
    {
     
    public void run()
     
    {
    for (int i=1;i<100;i++)
     
    {
    System.out.println("Runner1" + i); 
    }
    }
    }

    以下是线程的方法及属性:
    线程的方法(Method)、属性(Property)
    1)优先级(priority)
    每个类都有自己的优先级,一般property用1-10的整数表示,默认优先级是5,优先级最高是10;优先级高的线程并不一定比优先级低的线程执行的机会高,只是执行的机率高;默认一个线程的优先级和创建他的线程优先级相同;
     
    2)Thread.sleep()/sleep(long millis)
    当前线程睡眠/millis的时间(millis指定睡眠时间是其最小的不执行时间,因为sleep(millis)休眠到达后,无法保证会被JVM立即调度);sleep()是一个静态方法(static method) ,所以他不会停止其他的线程也处于休眠状态;线程sleep()时不会失去拥有的对象锁。作用:保持对象锁,让出CPU,调用目的是不让当前线程独自霸占该进程所获取的CPU资源,以留一定的时间给其他线程执行的机会;
     
    3)Thread.yield()
    让出CPU的使用权,给其他线程执行机会、让同等优先权的线程运行(但并不保证当前线程会被JVM再次调度、使该线程重新进入Running状态),如果没有同等优先权的线程,那么yield()方法将不会起作用。
     
    4)thread.join()
    使用该方法的线程会在此之间执行完毕后再往下继续执行。
     
    5)object.wait()
    当一个线程执行到wait()方法时,他就进入到一个和该对象相关的等待池(Waiting Pool)中,同时失去了对象的机锁—暂时的,wait后还要返还对象锁。当前线程必须拥有当前对象的锁,如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常,所以wait()必须在synchronized block中调用。
     
    6)object.notify()/notifyAll()
    唤醒在当前对象等待池中等待的第一个线程/所有线程。notify()/notifyAll()也必须拥有相同对象锁,否则也会抛出IllegalMonitorStateException异常。
     
    7)Synchronizing Block
    Synchronized Block/方法控制对类成员变量的访问;Java中的每一个对象都有唯一的一个内置的锁,每个Synchronized Block/方法只有持有调用该方法被锁定对象的锁才可以访问,否则所属线程阻塞;机锁具有独占性、一旦被一个Thread持有,其他的Thread就不能再拥有(不能访问其他同步方法),方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。

     

  • 相关阅读:
    关于返回上一页功能
    Mybatis Update statement Date null
    SQLite reset password
    Bootstrap Validator使用特性,动态(Dynamic)添加的input的验证问题
    Eclipse使用Maven2的一次环境清理记录
    Server Tomcat v7.0 Server at localhost failed to start
    PowerShell一例
    Server Tomcat v7.0 Server at libra failed to start
    商标注册英语
    A glance for agile method
  • 原文地址:https://www.cnblogs.com/hq-123/p/5767737.html
Copyright © 2011-2022 走看看