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.线程同步的弊端: 由于同一时间只能有一个线程访问共享数据,效率不高。