Java学习日记-----多线程

Thread的常用方法:
* 1.start();启动线程并执行相应的run()方法
* 2.run();子线程要执行的代码方法如run();内
* 3.currentThread() 静态的调取当前进程
* 4.getName()
* 5.setName()
* 6.yield() 调用此方法的线程释放cpu的使用权
* 7.join(); a.join(),表示当前a线程停止执行,直至另一线程执行完毕,a进程才继续执行join()后的代码
* 8.isAlive() 判断此线程是否还存活
* 9.sleep(long l): 显示的让当前线程sleep l毫秒
* 10.线程通信: wait() notify() notifyAll()
*
*
* 设置线程的优先级 setPriority

创建线程:

   ①:继承Thread类

/*
 * 创建一个子进程的子类,完成1-100之间自然数的输出。同样地,主线程执行同样地操作
 * 
 * 创建多线程的第一种方式: 继承java.lang.Thread类
 */
//1.创建一继承Thread的子类
class SubThread extends Thread{
    //2.重写Thread类的run()方法,方法内实现次子线程要完成的功能
    public void run() {
        for(int i =0;i<=100;i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
        }
    }
}
public class TestThread {
    public static void main(String[] args) {
        //3.创建子类的对象
        SubThread st1 = new SubThread();
        SubThread st2 = new SubThread();
        //启动此线程:调用相应的run()方法;然后调用run()方法
        //一个线程只能执行一次start()方法
        //不能通过Thread实现类对象的run()去启动一个线程
        st1.start();
        st2.start();
        
        for(int i =0;i<=100;i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
        }
    }
}

  ②:使用实现Runnable接口创建进程

//使用实现Runnable接口的方式,售票
/*
class Window1 implements Runnable{
    int ticket  = 100; 
    public void run() {
        while(true){
            if(ticket > 0) {
                try {
                    Thread.currentThread().sleep(10);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "售票: 票号为 :"
                        + ticket-- );
            }else {
                break;
            }
        }
    }
}
public class TestWindow1 {
    public static void main(String[] args) {
        Window1 w = new Window1();
        Thread t1 =new Thread(w);
        Thread t2 =new Thread(w);
        Thread t3 =new Thread(w);
        
        t1.setName("窗口1");
        t2.setName("窗口2");
        t3.setName("窗口3");
        
        t1.start();
        t2.start();
        t3.start();
    }
}
 此程序存在安全问题,打印车票时会出现重票、错票
  1.线程安全问题存在的原因?
         由于一个线程在操作共享数据的过程中,未执行完毕的情况下,另外的线程参与进来,导致共享数据存在了安全问题。
  
  2.如何解决线程的安全问题?
          必须让一个线程操作共享数据完毕以后,其他线程才有机会参与共享数据的操作。
  
  3.java如何实现线程的安全: 线程的同步机制
  
         方式一:同步代码块(同步机制)
             synchronized(同步监视器){
                  //    需要补同步的代码块()
          }
  ①.共享数据:多个线程共同操作的同一个数据(变量)
  ②.同步监视器: 由一个类的对象来充当。那个线程获取此监视器,谁就执行大括号里同步的代码。俗称:锁
          方式二: 同步方法

    将操作共享数据的方法声明为synchronized。即此方法为同步方法,保证当其中一个线程执行此方法时,
    其他线程在外等待直至此线程执行完此方法。
    >同步方法的锁:this
4.线程同步的弊端: 由于同一时间只能有一个线程访问共享数据,效率不高。

猜你喜欢

转载自www.cnblogs.com/Gaohy/p/8906935.html