Java基础 多线程编程 Thread Runnable jdk 8 Lambda 表达式 注解 Callable接口

本文介绍了Java中的多线程编程,包括进程与线程的区别、多线程的优点以及如何使用Thread类和Runnable接口创建线程。通过示例展示了线程的启动方法start(),强调了线程的并发执行特性。此外,文章还讨论了Lambda表达式的使用,以及Callable接口在多线程中返回结果的特性。
摘要由CSDN通过智能技术生成

Date和Long类型数据进行转换 日起在程序中主要是通过龙类型数据进行转换的

SimpleDateFormat类  对日期进行格式化 把Date类型的格式转换为字符串格式并且可以赋予相应的格式 

System类 系统中支持类

RuntTime类(用于返回当前应用程序的运行环境对象)  也存在GC  调用的还是system类里面的

线程的基本概念:

1 进程与线程的区别

进程:在操作系统的定义中指的是一次命令完整运行

目前的操作系统中是支持多进程启用的,而最早的misdos系统是单进程系统,一但中毒直接死机

单继承与多进程的区别?

缺点在执行两个任务的时候执行的速度取决于第一个任务执行的速度,这种操作对系统来说效率很低

在未来的发展中出现了多进程的系统,可以同时启动多个进程,CPU在多个进程之中进行不同的切换,让程序运行起来感觉很快

 

2 进程与线程的区别?

线程是在进程的基础上上进一步划分: 打开一个QQ.exe代表启动一个进程,在QQ可以聊天,聊天的同时可以传输文件,并且还可以语音聊天 在一个QQ进程中启动多个线程

例如:打开一个QQ 启动一个进程,在QQ上打开聊天 启动一个线程,在打开一个传输数据,又启动一个线程

从以上的结论中可以发现;在一个进程中可以存在多个线程:而线程是可以同时运行的

3多线程的优点:

效率高: 可以最大限度的利用CPU的空闲资源,比如一边编辑文档,一边打印文档中的内容

4 如何使用多线程

在java中存在两种方式可以完成多线程的使用,第一种方式就是 (继承)Thread类 ,在java中编写多线程程序的时候必须存在一个线程的主体类,而这个主体类只要继承了Thread类就可以完成多线程的功能

Thread这个存在于 java.lang.Thread类 可以直接使用不用导包

范例:继承Thread类

class MyThread extends Thread{

 

 

}

以上代码继承了一个Thread类,但是只继承Thread类并不能完成线程任务的编写,还必须覆写Thread类中run()方法,通过run()方法来完成线程任务的编写

范例:覆写run()方法 并编写线程执行的任务代码

class MyThread extends Thread{

private String title;  //给线程起一个名字

 

public MyThread(String title) {

 

this.title=title; //为线程命名

}

 

@Override

public void run() {  //这里编写需要多线程执行的代码

// TODO Auto-generated method stub

 

for(int i=0;i<10;i++) {  //在线程中输出10次i的内容

 

System.out.println(title+"="+i);

 

}

}

 

}

 

线程的主体代码已经编写完成,接下来启动一个线程

如何启动一个线程呢?

// 实例化线程的主体类 MyThread

 

public static void main(String[] args) {

 

MyThread  mt=new MyThread("线程A"); //实例化一个线程主体类 就等于实例化一个线程

 

MyThread mt1=new MyThread("线程B");

 

MyThread mt2=new MyThread("线程C");

 

mt.run(); //启动线程A

mt1.run(); //启动线程B

mt2.run(); //启动线程C

 

}

以上代码貌似启动了多线程,但是咱们分析,线程在程序中是同步运行,多个线程启动的时候会同时去抢占CPU的资源:

例如:军训的时候 饿一中午 到开饭的时间 65个人围一个大桌子 就存在一盆饭

多个线程启动的时候就相当于 抢饭一样,谁先抢到资源谁前执行

根据以上的分析,发现run()方法不能真正启动一个线程,而只是单纯的运行了run()方法中的代码,而想要真正启动一个线程,在Thread类中提供了一个start()方法 来启动一个真正的线程

范例:通过start()方法启动一个线程

// 实例化线程的主体类 MyThread

public static void main(String[] args) {

 

MyThread  mt=new MyThread("线程A"); //实例化一个线程主体类 就等于实例化一个线程

 

MyThread mt1=new MyThread("线程B");

 

MyThread mt2=new MyThread("线程C");

 

mt.start(); //启动线程A

mt1.start(); //启动线程B

mt2.start(); //启动线程C

 

}

 

程序的运行结果:

线程A=0

线程B=0

线程B=1

线程B=2

线程B=3

线程B=4

线程B=5

线程B=6

线程B=7

线程B=8

线程B=9

线程C=0

线程C=1

线程C=2

线程C=3

线程C=4

线程C=5

线程A=1

线程A=2

线程A=3

线程A=4

线程A=5

线程A=6

线程A=7

线程A=8

线程A=9

线程C=6

线程C=7

线程C=8

线程C=9

 

使用了start()方法启动了多线程之后,发现定义的3个线程在执行的时候 不是顺序执行了,而是随机的访问CPU的资源,过程为哪个线程先抢到资源哪个线程就先执行 线程的执行是存在随机性的

案例:

在正常的程序执行中:例如

Main方法中执行:存在三个任务

任务 输出一句话 输出任务1

任务2 会执行字符串拼接操作拼接100000万次 这个拼接的过程会很慢

任务3 输出 任务执行完毕

要求 把任务复杂的任务变为一个线程来执行,提升main方法中的速度

分析:该程序分为3步完成 任务1 于任务3 都需要在main方法中完成,只有任务2需要单独给定一个线程

范例:为任务2单独编写线程程序

class MyThread02 extends Thread{  //为任务2 编写线程任务

 

@Override

public void run() {  //单独的线程任务

// TODO Auto-generated method stub

 

String str=""; //空字符串等待拼接

 

for(int i=0;i<100000;i++) {

 

str+="hello";

}

}

 

 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值