Java多线程基本知识--概念、创建-创新互联
1、进程
站在用户的角度思考问题,与客户深入沟通,找到新沂网站设计与新沂网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都做网站、网站建设、企业官网、英文网站、手机端网站、网站推广、申请域名、网页空间、企业邮箱。业务覆盖新沂地区。进程是执行程序的一次执行过程,是系统资源分配的单位。
2、线程
一个进程可以包含多个线程,一个进程至少有一个线程。线程是CPU调度和执行的单位。
二、线程的创建 1、Thread:继承Thread类,Thread类实现了Runable接口。方式:自定义线程类继承Thread 》重写run方法,编写线程执行体 》 创建线程对象调用start
public class MyThread extends Thread{
@Override
public void run(){
for (int i = 0; i< 20; i++) {
System.out.println("这是一个线程"+i);
}
}
public static void main(String[] args) {
//main主线程
for (int i = 0; i< 20; i++) {
System.out.println("这是一个线程"+i);
}
//副线程
MyThread myThread=new MyThread();
// myThread.run();
//开启线程
myThread.start();
}
}
2、Runnable:实现Runnable接口。方式:自定义类实现Runnable 》重写run方法,编写线程执行体 》 创建线程对象调用start
public class RunnableTest implements Runnable{
@Override
public void run() {
for (int i = 0; i< 20; i++) {
System.out.println("测试"+i);
}
}
public static void main(String[] args) {
RunnableTest runnableTest=new RunnableTest();
Thread thread=new Thread(runnableTest);
thread.start();
for (int i = 0; i< 200; i++) {
System.out.println("主线程在运行"+i);
}
}
}
3、Callable:实现Callable接口。 实现Callable接口,需要返回值类型。
重写call方法需要抛出异常。
public class CallabaleTest implements Callable{
@Override
public Boolean call() throws Exception {
System.out.println("副线程执行");
return true;
}
public static void main(String[] args) {
CallabaleTest t1=new CallabaleTest();
CallabaleTest t2=new CallabaleTest();
CallabaleTest t3=new CallabaleTest();
//创建执行服务
ExecutorService service= Executors.newFixedThreadPool(3);
//提交执行
Futurer1=service.submit(t1);
Futurer2=service.submit(t2);
Futurer3=service.submit(t3);
//获取结果
try {
Boolean aBoolean = r1.get();
Boolean bBoolean = r2.get();
Boolean cBoolean = r3.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
//关闭
service.shutdown();
}
}
三、线程状态1、停止线程方式:建议线程正常停止、建议使用标志位、不要使用stop和destroy。
例子:使用标志位
public class ThreadStop implements Runnable{
//标志位
private Boolean flag=true;
@Override
public void run() {
while (flag){
System.out.println("running");
}
}
//停止方法
public void stop(){
flag=false;
}
public static void main(String[] args) {
//开启线程
ThreadStop stop=new ThreadStop();
new Thread(stop).start();
for (int i = 0; i< 10000; i++) {
if(i==900){
stop.stop();
break;
}
}
}
}
2、线程休眠sleep指定当前线程阻塞的毫秒数;
sleep存在异常InterruptedException;
sleep时间达到后线程进入就绪状态;
sleep可以模拟网络延时,计时器等;
每个对象都有一个锁,sleep不会释放锁;
3、线程礼让礼让线程,让当前正在执行的线程暂停,但不阻塞;
将线程从运行状态转为就绪状态;
让CPU重新调度,礼让不一定成功。
public class ThreadStop implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程开始执行");
Thread.yield();//线程礼让
System.out.println(Thread.currentThread().getName()+"线程结束执行");
}
public static void main(String[] args) {
//开启线程
ThreadStop stop=new ThreadStop();
new Thread(stop,"1").start();
new Thread(stop,"2").start();
}
}
4、线程强制执行(Join)join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞。类似插队。
public class ThreadStop implements Runnable{
@Override
public void run() {
for (int i = 0; i< 10; i++) {
System.out.println("副线程");
}
}
public static void main(String[] args) {
//开启线程
ThreadStop stop=new ThreadStop();
Thread thread = new Thread(stop, "1");
thread.start();
for (int i = 0; i< 100; i++) {
System.out.println("主线程");
if(i==20){
try {
//此时会让副线程执行完再执行主线程
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
5、线程状态观测Thread.State state=thread.getState();
线程状态:
NEW:尚未启动的线程处于此状态
RUNNABLE:在JAVA虚拟机中执行的线程处于此状态
BLOCKED:被阻塞等待监视器锁定的线程处于此状态
WAITING:正在等待另一个线程执行特定动作的线程处于此状态
TIMED WAITING:正在等待另一个线程执行动作达到指定等待时间的线程处于此状态
TERMINATED:已退出线程
6、线程的优先级Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度那个线程来执行。
线程的优先级用数字表示,范围1-10
Thread.MIN_PROIRITY=1;
Thread.MAX_PROIRITY=10;
Thread.NORM_PROIRITY=5;
使用以下方式改变和获取优先级
getPriority() ; setPriority(int xxx);
注意:优先级低只是意味获得调度的概率低,并不是优先级低就不会被调用,都看CPU掉度。
public class ThreadStop implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority());
}
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority());
//开启线程
ThreadStop stop=new ThreadStop();
Thread thread1 = new Thread(stop, "1");
Thread thread2 = new Thread(stop, "2");
Thread thread3 = new Thread(stop, "3");
Thread thread4 = new Thread(stop, "4");
Thread thread5 = new Thread(stop, "5");
thread1.setPriority(1);
thread2.setPriority(10);
thread3.setPriority(Thread.MIN_PRIORITY);
thread4.setPriority(Thread.MAX_PRIORITY);
thread1.start();
thread2.start();
thread3.start();
thread4.start();
thread5.start();
}
}
7、守护(daemon)线程线程分为用户线程和守护线程
虚拟机必须确保用户线程执行完毕
虚拟机不用等待守护线程执行完毕
作用后台操作日志、监控内存、垃圾回收
Thread thread=new Thread();
//默认false表示用户线程
thread.setDaemon(true);
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
本文名称:Java多线程基本知识--概念、创建-创新互联
文章出自:http://ybzwz.com/article/gpego.html