单线程和多线程
首先我们都知道线程是隶属于进程的,单线程就是程序中只有一个线程,多线程就是程序中有多个线程.通过连个例子理解多线程和单线程.
(一)单线程
创建包:package com.ffyc.javathread;
创建类:public class Sample { }
package com.ffyc.javathread;
public class Sample {
//方法1
public void method1(){
System.out.println("method1");
}
//方法2
public void method2(){
method1();
System.out.println("method2");
}
/**
*主方法(主线程),程序的入口
* 这不是多线程案例,是单线程
* @param args
*/
public static void main(String[] args) {
System.out.println("主线程开始");
Sample s = new Sample();
s.method2();
System.out.println("主线程结束");
}
}
上面的程序,我们很容易看懂,从main方法进入程序后,打印输出,创建Sample类的对象,然后调用了method2()方法,进入method2()方法后又调用method1()方法,执行完后再一次打印输出,执行过程看下图:
从上图不难发现,程序是顺着main方法这条主线一气呵成执行完的,所以这是一个单线程。
(二)多线程
package com.ffyc.javathread.demo2;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class MyThread implements Runnable {
/*
* 我们自己写的MyThread类实现Runnable接口,这个不叫线程类
* 只能叫线程要执行的任务
* */
@Override
public void run() {
//输出任务的优先级
System.out.println
(Thread.currentThread().getName()+": "+Thread.currentThread().getPriority());
}
}
package com.ffyc.javathread.demo2;
public class Test {
public static void main(String[] args) {
/*MyThread myThread = new MyThread(); myThread. 不出start方法,无法启动线程
上面的类中写过了,MyThread类不能叫线程,这个类中的内容只是线程要执行的任务
*/
MyThread myth = new MyThread();
//创建了一线程,并为其分配了一个任务,线程名称为"窗口1"
Thread th1 = new Thread(myth,"窗口1");
th1.start();
//创建了一线程,并为其分配了一个任务,线程名称为"窗口2"
Thread th2 = new Thread(myth,"窗口2");
th2.start();
Thread.currentThread().setPriority(10); //设置主线程(main()方法)的优先级
th1.setPriority(8); //设置线程(窗口1)的优先级
th2.setPriority(6); //设置线程(窗口2)的优先级
//输出主线程的优先级
System.out.println("main: "+Thread.currentThread().getPriority());
}
}
在测试类()test类中创建一个任务对象即可,每创建一个线程,要执行的任务都传递创建的那一个任务对象。输出结果:
输出了三个线程的优先级。
上面的程序中,
MyThread myth = new MyThread();
//创建了一线程,并为其分配了一个任务,线程名称为"窗口1"
Thread th1 = new Thread(myth,"窗口1");
th1.start();
这一段就是创建了线程th1,执行任务myth,给线程起名:“窗口1”。 注意,一定要调用start()方法启动线程,不能只创建,不启动。main()方法中创建了两个线程: th1 , th2 ,再加上main()这个主线程,共有三个线程,也就是多线程。
程序的输出结果中并没有按main()方法中的一步一步执行,本来先创建的是th1,但是执行时先执行的是th2线程,这也体现了多线程执行的特点,每个线程的执行顺序和操作系统的调度有关。