• 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就不能再拥有(不能访问其他同步方法),方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。

     

  • 相关阅读:
    Linux添加用户组和删除用户组
    购物意图分析
    架构是什么来的
    如何突破浏览器加载并发数的限制
    写JS自执行函数时要注意的
    网页是什么
    JVM
    javascript的边界
    浏览器
    HTTP
  • 原文地址:https://www.cnblogs.com/hq-123/p/5767737.html
Copyright © 2020-2023  润新知