1.多线程介绍
进程:指正在运行的程序。确切的说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并具有一定独立功能。
线程:线城市进程中的一个执行单元,负责当前进程中的程序的执行。一个进程至少有一个线程,一个进程中可以有多个线程,这样的应用程序也可以称之为多线程程序。
2.程序运行的原理
(1)分时调度
所有的线程轮流使用cpu的使用权,平均分配每个线程占用cpu的时间
(2)抢占式调度
优先让优先级高的线程使用cpu,如果优先级都一样,则会随机选择一个线程(线程随机性),java使用的就是抢占式调度。
3.主线程
package cn.itcast.demo01;
/*
* 程序中的主线程
*/
public class Demo {
public static void main(String[] args) {
function();
System.out.println(Math.abs(-9));
}
private static void function() {
for (int i = 0; i < 10000; i++) {
System.out.println(i);
}
}
}
4.lang包下的Thread类(线程类)
(1)自定义子类,继承Thread类,重写其中的run方法
package cn.itcast.demo01;
/*
* 创建和启动一个线程
* 创建Thread子类对象,调用start()方法
* 让线程程序执行,JvM调用方法run()
*/
public class ThreadDemo {
public static void main(String[] args) {
Thread t = new SubThread();
t.start();
for (int i = 0; i < 50; i++) {
System.out.println("main..."+i);
}
}
}
package cn.itcast.demo01;
/*
* 定义子类,继承Thread
* 重写父类的run方法
*/
public class SubThread extends Thread {
public void run(){
for (int i = 0; i < 50; i++) {
System.out.println("run..."+i);
}
}
}
(2)自定义子类,实现Runnable接口,重写其中的run方法
package cn.itcast.demo04;
public class Subrunnable implements Runnable {
public void run() {
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(100L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("run..."+i);
}
}
}
package cn.itcast.demo04;
public class ThreadDemo {
public static void main(String[] args) {
Subrunnable sr = new Subrunnable();
Thread t = new Thread(sr);
t.start();
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(100L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("mian..."+i);
}
}
}
实现Runnable的好处:
(1)避免单继承的局限性
(2)降低代码的耦合度
3.匿名内部类实现对县城程序
package cn.itcast.demo05;
public class ThreadDemo {
public static void main(String[] args) {
//继承方式
new Thread(){
public void run(){
System.out.println("!!!");
}
}.start();
//实现接口方式
new Thread(new Runnable() {
public void run() {
System.out.println("嘤嘤嘤");
}
}).start();
}
}