进程、线程、程序之间的区别:每个运行中的程序就是一个进程,当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程;当一个程序进入内存中运行,即变成了一个进程,进程是系统进行资源调度和分配的一个独立单位。
实现多线程主要有两种方式:1.实现Runnable接口,重写run函数;
2.继承Thread类(Thread类实现了Runnable接口),重写run函数。
一、通过实现Runn接口
Runnable接口非常简单,它只包含一个run方法,需要实现这个方法来高速系统线程将如何运行。
package test;
public class project1 {
public static void main(String []args) {
Runnable printA=new printChar('A',100);
Runnable printB=new printChar('B',100);
Runnable print100=new printNum(100);
Thread thread1=new Thread(printA);
Thread thread2=new Thread(printB);
Thread thread3=new Thread(print100);
thread1.start();
thread2.start();
thread3.start();
}
}
class printChar implements Runnable{
private char charToPrint;
private int time;
public printChar(char charToPrint,int time) {
this.charToPrint=charToPrint;
this.time=time;
}
@Override
public void run() {
for(int i=0;i<time;i++) {
System.out.print(charToPrint);
}
}
}
class printNum implements Runnable{
private int lastNum;
public printNum(int lastNum) {
this.lastNum=lastNum;
}
@Override
public void run() {
for(int i=0;i<lastNum;i++)
System.out.print(i+" ");
}
}
使用 Thread thread1=new Thread(printA);创建任务的进程 ,其中 printA为实例。
然后调用start()方法告诉Java虚拟机该线程准备运行 thread1.start();
还可以这样启动线程:
Runnable printA=new printChar('A',100);
new Thread(printA).start();
二、通过继承Thread类
Thread类的方法如下:
+Thread() 创建一个空的线程
+Thread(task:Runnable) 为指定任务创建一个线程
+start():void 开始一个线程导致JVM调用run方法
+isAlive():boolean 测试线程当前是否在运行
+setPriority(p:int):void为该线程指定优先级(1到10)
+join():void 等待该线程结束
+sleep(millis:long):void 让一个线程休眠指定时间,以毫秒为单位
+yield():void 引发一个线程暂停并允许其他线程执行
+interrupt():void中断该线程
@Override
public void run() {
for(int i=0;i<time;i++) {
System.out.print(charToPrint);
Thread.yield();
}
}
每打印一个字母后,printA/printB线程就会让出时间给其他线程。
@Override
public void run() {
try {
for(int i=0;i<lastNum;i++)
System.out.print(i+" ");
Thread.sleep(1);
}catch(Exception e) {
e.printStackTrace();
}
}
每打印一个数字之和,print100线程就会休眠1毫秒。sleep方法可能抛出一个InterruptedException,这是一个必检异常,当interrupt()方法被调用时,就会抛出这样一个异常。
@Override
public void run() {
Thread thread4=new Thread(new printChar('C',140));
thread4.start();
try {
for(int i=0;i<lastNum;i++) {
thread4.join();
System.out.print(i+" ");
}
}catch(Exception e) {
e.printStackTrace();
}
}
join()方法使得,thread4线程结束后,run()方法继续打印数字。
Java给每个线程指定一个优先级。默认情况下,线程继承生成它们的线程的优先级。可以用setPriority改变线程的优先级。还可以用getPriority方法获取线程的优先级。优先级从1到10.Thread类的int类型常量MIN-PRIORITY、NORM-PRIORITY 、MAX-PRIORITY,分别代表1,5,10.主线程的优先级是Thread.NORM-PRIORITY。
Java虚拟机总是选择优先级最高的可运行线程来运行。如果所有可运行线程具有相同的优先级,那将会用循环队列给它们分配相同的CPU份额,这称为循环调度。