1.多线程:
进程:就是一个正在执行的程序
程序的运行:内存和CPU的支持
编程:就是一个可以执行的程序
线程:一个程序中的一条执行路径
2.创建多线程
首先,线程是在java.lang.Thread类下
3.线程的创建和启动
第一种方式:将类声明为Thread的类的子类并重写run()方法。
package xiancheng.Demo01;
/*
* 通过Thread继承实现多线程
*线程的创建方式一:
*step1:声明一个子类,继承Thread类
*step2:重写run(),线程体
*step3:启动线程:start()
* */
public class Demo01 {
public static void main(String[] args) {
//调用线程
Test t = new Test();
t.start();
System.out.println("main方法");
}
}
//创建线程
class Test extends Thread{
@Override
public void run() {
System.out.println("另一条线程");
}
}
第二种方式:定义类实现Runnable接口的类
Runnable接口中只有一个方法 public void run();用来定义线程运行体
package xiancheng.Demo01;
/*
* 通过Runnable接口实现多线程
*线程的创建方式二:
*step1:实现类实现Runnable接口
*step2:重写run()
*step3:启动线程:start(),根据实现类的对象,创建thread类的对象,再执行start()
* */
public class Demo02 {
public static void main(String[] args) {
Test1 t = new Test1();
Thread thread = new Thread(t);
thread.start();
System.out.println("main方法中的线程!");
}
}
class Test1 implements Runnable{
@Override
public void run() {
System.out.println("另一条线程!");
}
}
两种线程方式的比较
一、使用Runnable接口
1.还可以从其他类继承
2.保持风格的一致性
二、直接继承Thread类
1.不能再从其他类继承
2.编写简单,可以直接操作线程
注:使用实现Runnable接口的方式创建线程时可以为相同程序代码的多个线程提供共享的数据。
例子:
//当时用继承的时候,他每一次创建对象都会将共享的数据恢复初始值,所以这个一共会打印出30条数据
public class Demo01 {
public static void main(String[] args) {
Test t = new Test();
Test t1 = new Test();
Test t2 = new Test();
t.start();
t1.start();
t2.start();
}
}
class Test extends Thread{
private int i = 10;
@Override
public void run() {
while(i > 0){
System.out.println("当前的数据为:" + i--);
}
}
}
//通过接口,线程运行的时候会共享公共的数据。
class Myrun implements Runnable{
private int i = 10;
@Override
public void run() {
while (i > 0){
System.out.println("当前数据为: " + i--);
}
}
}
public class Demo01 {
public static void main(String[] args) {
Myrun mr = new Myrun();
Thread t = new Thread(mr);
Thread t1 = new Thread(mr);
Thread t2 = new Thread(mr);
t.start();
t1.start();
t2.start();
}
}
匿名对象调用
public static void main(String[] args) {
new Thread(){
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if(i % 2 == 0){
System.out.println(Thread.currentThread().getName() + ": " + i);
}
}
}
}.start();
new Thread(){
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if(i % 2 != 0){
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
}.start();
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
小结:
当程序运行时,JVM会产生一个线程(主线程),主方法(main方法)就是在这个线程上运行的。
可以通过Thread的实例来创建新的线程
每个线程都是通过某个特定的Thread类对象所对应的方法run()来完成操作的,方法run()称为线程体。
通过Thread类的start()方法来启动一个线程,线程进入Runnable(可运行)状态,它将向线程调度器注册这个线程。
调用Start方法并不一定马上会运行这个线程,正如上面所说,它只是进入到了Runnable而不是Running()
注意:不要直接调用线程run方法。