1.线程与进程

进程:执行中的程序
     
     线程:轻量级的进程
                线程本身不能单独运行,必须放在一个进程中才能执行。
     例如:QQ是一个进程,但里面与每个人的聊天又是一个个的线程

2.java中的线程模型

1.新建状态:线程被创建之后便处于新建状态
   2.就绪状态:新建状态的线程调用start()进入就绪状态
   					    阻塞状态的线程解除阻塞之后进入就绪状态
   3.运行状态 :处于就绪状态的线程获得了CPU的资源,该线程就进入了运行状态
   4.阻塞状态:是一个正在运行的线程,因为一些原因让出CPU资源暂时中止而进入的状态
   5.终止状态
   1.正常终止
   2.强制终止:stop ,destory
   3.异常终止:当线程中产生了异常,线程就会终止

3.创建线程

## 1继承Thread类创建线程
public class MyThread extends Thread {
    //Thread类具有多线程的功能,通过继承Thread来具有线程的功能
	public void run() {
		for(int i=0;i<10;i++) {
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("MyThread"+i);
		}
	}
}
public class ThreadDemo {
	public static void main(String[] args) {
         MyThread mt=new MyThread();
        // mt.run();//仍是单线程来进行执行,程序从上到下
         mt.start();//start()相当于run方法,又创建了一个线程
         for(int i=0;i<10;i++) {
        	  try {
				Thread.sleep(10);//相当于睡眠1000毫秒进行的是两个不同的线程
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				 
			}
        	System.out.println("主线程"+i);
         }
         System.out.println("程序执行结束");
	}
}
## 2.继承Runnable类创建线程
public class MyThread implements Runnable{
    public void run() {
    	for(int i=0;i<10;i++) {
    		try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    		System.out.println("MyThread"+i);
    	}
    }
}
public class RunnableDemo {
   
   public static void main(String[] args) {
	   MyThread mt=new MyThread();
	   Thread t =new Thread(mt,"线程1");
	   t.start();
	   for(int i=0;i<10;i++) {
		   try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		   System.out.println("主线程"+i);
	   }
    }
}
## 3.多个进程并发执行
public class MyRunnable1 implements Runnable {

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<100;i++) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.print("+");
		}
		
	}

}
public class MyRunnable2 implements Runnable {

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<100;i++) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.print("*");
		}
	}
  
}
public class Mydemo {
     
     public static void main(String[] args) {
    	 MyRunnable1 r1=new MyRunnable1();
         MyRunnable2 r2=new MyRunnable2();
         Thread t1=new Thread(r1);
         Thread t2=new Thread(r2);
         t1.start();
         t2.start();
	}
}

注意:java对于线程启动后唯一能保证的是每个线程都被启动并且结束。但是对于哪个先启动,哪个后启动,什么时候执行,是没有保证的。
线程优先级:java中优先级高的线程有更大的可能性获得CPU,但不是优先级高的总是先执行,也不是优先级低的线程总是后执行
java中可以获得进程优先级,并且可以自己设定进程优先级,最高是10,最低是0

4.java中进程调度的3个方法

1.sleep(毫秒数) ,sleep(毫秒数,纳秒数 )
2.yield() 释放资源,之后两者会一起竞争资源
3.join() ;a.join 加入到进程