关于java线程的理解

    技术2025-04-01  11

    最近在看java多线程的东西,做一下个人总结:

    java多线程说白了就是让多个对象同步执行,

    package com.bossoft.boz;

    public class DosomeThing extends Thread { public DosomeThing(String name){  super.setName(name); }  public void run(){  for (int i=0; i<200; i++){      System.out.println(Thread.currentThread().getName()+":"+i);  } } public static void main(String[] args) throws InterruptedException{  Thread d1 = new DosomeThing("张三");  Thread d2 = new DosomeThing("李四");  d1.start();  d2.start();  //d2.join();  //d2.sleep(1000);     }}

    上段代码有三个线程执行,main(主线程),d1,d2

    执行d1.start();表示让d1进入可运行状态,但是并不表示d1里面的run方法就一定会执行。因为没有进入运行状态。

    一个对象要多线程执行,则相对应的类必须是extends thread或者importments runnable接口的,线程的名字可以手动指定,也可以系统自动赋值,通常Thread.currentThread().getName()得到线程的名称。但是必须是thread类或者他的子类才会有setName方法,runnable是个接口,没有setName()方法。要是你的对象是importments runnable则将Thread t1 = new Thread(d1);t1.setName()就可以了。

    围绕多线程的一些方法也无非是

    start:开始,线程进入可运行状态

     join:当前线程优先执行,从某种意义上说就是同步了

    sleep:让线程休眠,线程还是可运行状态的

    setPriority:设置线程的优先级,cup一般给高优先级的分配时间多,但是并不是高优先级的就一定先执行,别妄想这样控制cpu

    synchronized:是线程同步的标志,

    关于锁和同步,有一下几个要点: 1)、只能同步方法,而不能同步变量和类; 2)、每个对象只有一个锁;当提到同步时,应该清楚在什么上同步?也就是说,在哪个对象上同步? 3)、不必同步类中所有的方法,类可以同时拥有同步和非同步方法。 4)、如果两个线程要执行一个类中的synchronized方法,并且两个线程使用相同的实例来调用方法,那么一次只能有一个线程能够执行方法,另一个需要等待,直到锁被释放。也就是说:如果一个线程在对象上获得一个锁,就没有任何其他线程可以进入(该对象的)类中的任何一个同步方法。 5)、如果线程拥有同步和非同步方法,则非同步方法可以被多个线程自由访问而不受锁的限制。

    6)、线程睡眠时,它所持的任何锁都不会释放。

    7)、线程可以获得多个锁。比如,在一个对象的同步方法里面调用另外一个对象的同步方法,则获取了两个对象的同步锁。 8)、同步损害并发性,应该尽可能缩小同步范围。同步不但可以同步整个方法,还可以同步方法中一部分代码块。 9)、在使用同步代码块时候,应该指定在哪个对象上同步,也就是说要获取哪个对象的锁。 理解时只要知道,锁是用来对付对象的(当然是包括方法啦)。
    最新回复(0)