文章目录
1.进程和线程的区别
- 进程:是程序的执行过程,具有动态性,即运行的程序就叫进程,不运行就叫程序;
- 线程:系统中的最小执行单元,同一进程中有多个线程,线程可以共享资源,一旦出现共享资源,必须注意线程安全!!
Java线程分为两类,一类是守护线程,典型是垃圾回收GC;第二类是用户线程,当JVM中都是JVM守护线程,那么当前的JVM将退出。
2.线程创建的两种方式,继承Thread类、实现Runnable接口
2.1继承Thread类
即创建的线程类继承Thread
类,重写其中的run
方法,若在主类中调用线程的话,则new
出线程类,调用它的start
方法即可,这里的start
方法完成了两个工作:启动子线程,调用子线程的run
方法;如下列:
//线程类
class TestThread extends Thread {
@Override
public void run() {
for(int i = 1; i <= 100; i++){
if(i % 2 == 0){
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
}
主类中调用:
TestThread myThread = new TestThread();
TestThread2 myThread2 = new TestThread2();
myThread.setName("偶数线程");//为线程命名
myThread2.setName("奇数线程");
myThread.start();//启动线程
myThread2.start();
Thread.currentThread().setName("主线程");//Thread.currentThread()表示当前的线程
for(int i=1;i<=100;i++){
System.out.println(Thread.currentThread().getName()+ ":" + i);
}
2.2实现Runnable接口
即创建的线程类实现Runnable
接口,实现其中的run
方法,若在主类中调用线程的话,则new
出线程类,这里注意不能直接调用它的start
方法,而是通过Thread 线程名 = new Thread(new出来的类)
,然后调用这个线程的start
的方法才能启动线程,反之线程的启动该必须调用start
方法!比extends Thread
类的方法略微复杂,但这种方式更具优势(下面在做具体说明),比如:
class TestThread2 implements Runnable{
public void run() {
for(int i = 1; i <= 100; i++){
if(i % 2 != 0){
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
}
然后调用时一定注意,不是直接调用start
方法,
TestThread2 myThread2 = new TestThread2();
Thread t2 = new Thread(myThread2);
t2.setName("奇数线程");//为线程命名
t2.start();//启动线程
Thread.currentThread().setName("主线程");//Thread.currentThread()表示当前的线程
for(int i=1;i<=100;i++){
System.out.println(Thread.currentThread().getName()+ ":" + i);
}
3.线程中的几个常用的方法以及其生命周期
3.1几个常用的方法:
注: t
为一个线程的名字,有如下说明
t.yield()
,会使t线程释放当前cpu资源,但如果有锁的话他不会释放锁;t.join()
,使当前的线程停下来,启动并执行t线程,只有当t线程完全执行完后,当前线程才可以继续执行;t.sleep(i)
,显示的让t线程睡眠i毫秒,sleep方法执行期间不会释放他的锁;- 线程通信过程中的几种方法: