您的位置:首页 > 编程语言 > Java开发

Java多线程快速入门

2017-08-25 14:59 591 查看

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()唤醒他才会重新工作。释放锁
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: