Java学习第二十二天知识点(线程)
程序:是一个指令和数据的有序集合.
进程:在运行中的程序 -进程是资源分配的最小单位
线程:在进程中[多个同时在执行]的任务 - 线程是cpu的最小调度单位
并行: 指两个或多个事件在同一时刻发生(同时发生)
并发: 指两个或多个事件在同一时间段内发生
线程类:Thread
1.线程的概念
1).进程中多个同时执行的任务
2).主方法程序运行就是打开一个进程,进程中至少存在一个线程 - 主线程 main
2.自定义线程的方式
1)自定义线程类 - 继承 Thread
a.自定义线程类,继承Thread
b.重写run()
c.创建线程对象
d.start()开启线程
结论: 一个类只能有一个父类,当他继承Thread,这个类就只能是线程类了,有局限性
2).自定义任务类 - 实现Runnable接口
a.自定义类任务类,实现Runnable接口
b.重写run()
c.创建任务类对象
d.通过任务类对象,构造线程对象
e.start()开启线程
结论:
a.类除了可以实现Runnable接口,还可以继承其他类,和实现其他接口,没有太多的局限性
b.在创建相同的任务线程时,任务对象可以重复使用
3).匿名内部类创建线程类 - 结合(1)或(2)
注意: 这不是一种创建方式,只是一种优化写法
线程创建测试运行代码:
public class ThreadDemo01 {
public static void main(String[] args) {
//线程可以多创建
MyThread myThread = new MyThread();
myThread.start();
//添加线程名字
MyThread myThread0 = new MyThread("老线程!");
myThread0.start();
MyThread myThread1 = new MyThread("新线程!");
myThread1.start();
//通过匿名内部类的方法写
Thread myThread2= new Thread("匿名"){
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(getName()+i);
}
}
};
myThread2.start();
/*任务类*/
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable,"run!");
thread.start();
//嵌套写法
Thread thread1 = new Thread(new MyRunnable(), "nmRun!");
thread1.start();
//常用写法
Runnable myRunnable1 = new Runnable(){
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"匿名Run"+i);
}
}
};
Thread threadNM = new Thread(myRunnable1,"匿名run!");
threadNM.start();
//匿名完全嵌套写法
Thread thread2 = new Thread(new Runnable(){
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"匿名Run1"+i);
}
}
}, "nmRunNM!");
thread2.start();
//System.out.println(thread2.isDaemon());
//主线程
for (int i = 0; i < 10; i++) {
System.out.println("主要线程"+i);
}
}
}
自定义线程:
public class MyThread extends Thread{
public MyThread() {
}
public MyThread(String name) {
super(name);
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
//Thread.currentThread().getName()
System.out.println(getName()+"正在执行"+i);
}
}
}
自定义任务类:
public class MyRunnable implements Runnable{
public MyRunnable() {
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"runnable"+i);
}
}
}
3.Thread常用API:
1).currentThread() -> 获取当前线程对象
2).getName() ->获取当前线程对象的名字
3).getPriority() -> 获得线程优先级
setPriority -> 设置线程优先级
注意:
范围: 1 ~ 10
数越大,优先级越高(优先级只是改变cpu分配时间片的概率)
4).isDeamon() -> 询问是不是守护线程
注意:
守护线程 / 前台线程
当所有的前台线程都结束之后,守护线程也会自动结束
java中自带的守护线程 - GC
守护线程测试代码:
public class priorityDemo {
public static void main(String[] args) {
Runnable myRunnable1 = new Runnable(){
@Override
public void run() {
for (int i = 0; i < 100; i++) {
try{
Thread.sleep(10);
System.out.println(Thread.currentThread().getName()+":"+i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("一完了");
}
};
Runnable myRunnable = new Runnable(){
@Override
public void run() {
for (int i = 0; i < 100; i++) {
try{
//结束进程需要时间所以设置sleep,给予反应时间
Thread.sleep(10);
System.out.println(Thread.currentThread().getName()+":"+i);
} catch (InterruptedException e) {
e.printStackTrace();
}
//System.out.println(Thread.currentThread().getName()+":"+i);
}
System.out.println("二完了");
}
};
Thread thread1 = new Thread(myRunnable,"二");
//thread1.setDaemon(true);
thread1.start();
Thread thread = new Thread(myRunnable1,"一");
thread.setDaemon(true);
thread.start();
}
}
5).Thread.sleep() -> 线程休眠指定时间