1、 多线程概述(为什么我们要用多线程)
进程: 是一个正在执行中的程序,每一个进程都有一个执行顺序。该顺序可以叫做执行路径,或者叫做一个控制单元。
线程: 线程就是进程当中执行的一条路径,也是进程当中的一个控制单元。一个应用程序中一定会有一个线程,这个线程我们叫做主线程。
多线程: 多线程就是一个应用程序中,有多个不同的执行路径。我们就叫做多线程。
多线程场景:迅雷下载、QQ聊天、游戏客户端。提高程序效率
为什么我们用使用多线程?
为了提供程序的运行效率!
2.1如何创建一个线程呢?
创建线程方式一:继承Thread类。
步骤:
1,定义一个类继承Thread类。
2,覆盖Thread类中的run方法。
3,直接创建Thread的子类对象创建线程。
4,调用start方法开启线程并调用线程的任务run方法执行。
主线程的名字就是main。
面试题?使用继承Thread类创建线程好?还是使用实现Runnable创建线程好?
Runnable接口好?一旦我们继承了Thread类,不能在继续继承,一旦实现了Runnable接口,还可以继续继承类。
练习题 创建两条线程进行交互执行。
package itmayi;
/**
* 练习题 创建两条线程进行交互执行
* @author zzq
*
*/
class ThreadDemo2 extends Thread{
private String name;
public ThreadDemo2(String name){
this.name = name;
}
public void run(){
System.out.println(name+"开始执行啦!");
for (int i = 0; i < 20; i++) {
System.out.println(name+"线程:i:"+i);
}
}
}
public class DemoThread2 {
public static void main(String[] args) {
ThreadDemo2 threadDemo = new ThreadDemo2("张三");
ThreadDemo2 threadDemo2 = new ThreadDemo2("李四");
//threadDemo.run();
//threadDemo2.run();//顺序执行
threadDemo.start();
threadDemo2.start();//线程执行
}
}
线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。
新建状态:
ThreadDemo2threadDemo2 = newThreadDemo2("李四");
只是初始化了,还没有调用start方法。
一旦调用start方法,就进入就绪状态。
一旦调用了某个线程,就进入运行状态,执行run方法。
/**
* 演示阻塞和死亡
* @author zzq
*
*/
class TestThread extends Thread{
public TestThread(String threadName){
super(threadName);
}
/**
* 创建线程执行的代码都放在run方法中
*/
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("线程名称:"+this.getName()+"i:"+i);
System.out.println("id:"+this.currentThread().getId()+"线程名称:"+this.getName()+"i:"+i);
//getName 获取定义的值name
//currentThread() 获取唯一的标识 是算法算的不是自己定义的
if(i==5){
//(停止状态)
this.stop();
}
try {
//(阻塞)每隔一秒打印一个i值
this.sleep(1000);
} catch (Exception e) {
}
System.out.println("i:" + i);
}
}
}
public class ThreadTest {
public static void main(String[] args) {
TestThread testThread = new TestThread("线程1");
testThread.start();
TestThread testThread2 = new TestThread("线程2");
testThread2.start();
}
}
6、获取线程相关信息
CurrentThread():返回当前正在执行的线程对象的引用。
GetId():返回该线程的标识符。
GetName():返回该线程的名称。
class TestThread2 extends Thread{
public TestThread2(String testName){
super(testName);
}
public void run() {
System.out.println("子线程");
for(int i =0;i<20;i++){
//this.getName()是通过构造函数传进来的testName,自动赋值给线程中的name
System.out.println("线程名称"+this.getName()+"i:"+i);
/**
* this.currentThread()获取当前线程的引用(线程唯一的标识,
* id值是多线程算法算的,不是自定义的)
*
*/
System.out.println("id:"+this.currentThread().getId()+"线程名称:"+this.getName()+"i:"+i);
//getName获取定义的值name
//currentThread()获取唯一的标识 是算法算的不是自己定义的
if(i==5){
this.stop();
}
try {
this.sleep(1000);
} catch (Exception e) {
}
System.out.println("i:" + i);
}
}
}
public class ThreadTest2 {
public static void main(String[] args) {
System.out.println("主线程");
TestThread2 TestThread2 = new TestThread2("线程1");
TestThread2.start();
TestThread2 TestThread3 = new TestThread2("线程2");
TestThread3.start();
}
}
7、真实企业多线程分批处理数据
什么是多线程?
在一个应用程序中,同时有多个不同的执行路径。
说一下多线程的好处?
提高程序效率。
线程和进程有什么区别?
线程是进程 的一条执行路径,而进程是线程的集合。
什么是线程同步、异步?
线程同步表示,当前线程执行完后下一个线程接着执行。(当有多个线程去共享同一个变量的时候,只让一个线程使用,使用完成之后释放了锁,才能让其他线程使用)
线程异步表示,在一个应用程序中,同时有多个不同的执行路径。(两个代码同时在一起执行)例如javaweb,ajax,android,handler
什么是线程不安全?
当多个线程共享同一个变量的时候,会造成其他线程的干扰,如何解决:使用线程同步技术,用上锁(synchronized).让一个线程执行完了,再让另一个线程执行。
Sleep()和wait()有什么区别?
Sleep是让当前线程指定休眠时间,然后继续工作,不释放锁。
让当前线程wait则是等待,直到有线程通知notify()唤醒他才会重新工作。释放锁