Java多线程入门
Java多线程入门
线程是操作系统课程中提到的一个概念,是系统调度和分配的最小单元,其自身并不拥有系统资源,但与同属一个进程的其他线程共享进程所拥有的的全部资源。多线程编程可以使得程序共有两条或者两条以上的并发执行线索,即同时完成一个工作的多个部分。
1. 线程类
Java中线程有两方面的含义
- 一条独立执行的线索
- Thread类或继承了Thread类的对象
自定义线程类
- 继承Thread
class a extends Thread{
public void run()
{
}
}
- 实现Runnable接口
class b implements Runnable{
public void run(){
}
}
相对而言,第二种方法更好一些,因为Java中只能继承一个类,若是用接口实现自定义线程会更好。
2. 线程对象
- 继承Thread
Thread aa=new a();
- 实现Runnable接口
b bb=new b();
由于以上类b虽然实现了Runable接口,有多线程功能,然而其本身还不是一个线程,因此还要进行一下转化
b bb=new b();
Thread c=new Thread(bb); //这里使用Thread构造器 public Thread(Runable t)
3. 线程启动
class b implements Runnable {
public void run() {
System.out.println("Just a test");
}
}
public class Test {
public static void main(String[] args) {
b bb = new b();
Thread c = new Thread(bb);
//c.start();
c.start();
}
}
线程对象在一个生命周期(开始之后,结束之前)只能start一次
不然就会出现如下错误
4. 多线程启动
class a implements Runnable {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Just a test a");
}
}
}
class b implements Runnable {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Just a test b");
}
}
}
public class Test {
public static void main(String[] args) {
a aa = new a();
b bb = new b();
Thread c = new Thread(aa);
Thread d = new Thread(bb);
// c.start();
c.start();
d.start();
}
}
结果为
前面先是打印了7个a,之后再是10个b,再是3个a。说明多线程运行时,结果并不是和想象中一致的,操作系统相关知识也有所解释,在操作系统中,线程是CPU调度单位,系统会为每一个线程分配一个时间片,如果某个线程的时间用光了,这个线程就会暂时转入就绪状态。因此上面程序运行的结果也就可以解释了,系统在多线程调度时并不会保证一个线程的启动时间和运行时间,线程可以使交替运行的,多次执行也可能会产生不同的结果。
再次运行程序,结果为
5. 线程的简单补充
- 线程的优先级
Java中线程的优先级用1~10的整数来进行表示,数值越大优先级越高,默认优先级是5,子线程默认与其父线程的优先级相同
public class Test {
public static void main(String[] args) {
a aa = new a();
b bb = new b();
Thread c = new Thread(aa);
Thread d = new Thread(bb);
// c.start();
c.setPriority(10);
c.start();
d.start();
}
}
然而值得一提的是,尽管设置线程c的优先级更高,也不能完全保证c就一定会在d之前运行,这只是一个概率高低问题