程序是为完成特定任务、用某种语言编写的一组指令的集合。是一段静态的代码。
进程是程序的一次执行过程,是一个动态的概念。
java.lang.Thread
每个线程都是调用Thread对象的run()方法来完成操作的,然后通过start()来调用这个线程,创建方式如下:
main{ Thread t0=new TestThread(); t0.start(); } public class TestThread extends Thread{ @Override public void run(){ //运行代码 } }
main{ Thread t3=new Thread(new TestRunnable()); Thread t4=new Thread(new TestRunnable(),"name"); t3.start(); } public class TestRunnable implements Runnable{ @Override public void run(){ //运行代码 System.out.println(Thread.currentThread().getName()); } }
两种方式都需要最终通过Thread来运行run方法,但多个线程可以共享同一个接口实现类的对象,非常适合多个相同线程来处理同一份资源,因此一般通过继承方式实现线程较多(同时也可以避免单继承的局限性)。
Thread.State
main{ Account a=new Account(); User u_v=new User(a,2000); User u_a=new User(a,2000); Thread weixin=new Thread(u_v,"weixin"); Thread zhifubao=new Thread(u_a,"zhifubao"); weixin.start(); zhifubao.start(); } class User implements Runnable{ int money; public User(Account account,money){ this.account=account; this.money=money; } Account account; @Override public void run() { account.drawiny(money); } } class Account{ static int money=3000; //在普通方法前加synchronized锁的是整个对象(static除外) public synchronized void drawing(int m){ if(money < m){ return; } String name=Thread.currentThread().getName(); System.out.println(name+money); money-=m; System.out.println(money); } public void drawing(int m){ synchronized(this){ if(money < m){ return; } String name=Thread.currentThread().getName(); System.out.println(name+money); money-=m; System.out.println(money); } } }
Java.lang.Object中提供的这三个方法只有在synchronized修饰的方法或代码块中才可以使用
public class Test3{ public static void main(String[] args){ Clerk c=new Clerk(); new Thread(new Runnable(){ @Override public void run(){ synchronized(c){ while(true){ if(c.productNum == 0){ //生产 c.productNum++; c.notify(); }else{ c.wait(); } } } } },"生产者").start(); } } Class Clerk{ public static int productNum=0; }