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 加入到进程