java 非法线程_java-多线程

88bb6d3bc05d2026ac1147f840e33748.png

并发性是一系列性能技术,专注于减少等待

如果你的程序中的一个任务由于程序控制之外的某些条件(通常是I/O)而无法继续,我们会说任务或线程阻塞

进程和线程

b3ebf2e0caad33e3b890e6cc4f1b27e4.png

6aeca0835a7c4eb02a0ab50f2346fc62.png

0ad727448e7bc80c68994ebacd412dd9.png

线程的调度:

分时调用

所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间

抢占式调度

优先让优先级较高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),

java使用的为抢占式调度

db118a202c88cb0dc5e0a8a35aa72f8f.png

主线程

/*主程序:执行主方法的线程

单线程程序:java程序中只有一个线程

执行从main方法开始,从上到下一次执行*/

4a13d365f79d3736627f46dcc34c5840.png

单线程程序

public classDemo1Test {public static voidmain(String[] args) {

Person p1= new Person("xiaoqiang");

p1.run();

Person p2= new Person("wacai");

p2.run();

}

}

d7852ee40af48c20b0a891fc9fad7787.png

创建线程累

/*创建多线程程序的第一种方式,创建Thread的子类

实现多线程程序,必须继承Thread累

实现步骤

1创建一个子类

2再Thread得子类中重写run方法,设置线程任务

3创建子类实例对象

4调用Thread累得方法start,开启心得线程,。执行run方法

void start() 使线程开始执行,JVM调用该线程得run方法

结果使两个线程并发运行,当前线程(main)线程,和另外一个线程

多次启动同一个线程使非法得,特别是当线程已经执行接受,不能在重新启动

java程序属于抢占式调度,那个线程优先级高,哪个线程优先执行,

同一个优先级,随机调度*/

创建子类:

public class MyThread extendsThread{

@Overridepublic voidrun() {for (int i = 0; i < 20; i++) {

System.out.println("done:"+i);

}

}

}

实例化子类并调用start方法:

public classDemo2Test {public static voidmain(String[] args) {

MyThread myThread= newMyThread();

myThread.start();for (int i = 0; i < 20; i++) {

System.out.println("maindone:" +i);

}

}

}

结果

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

maindone:0done:0done:1done:2done:3done:4done:5done:6done:7maindone:1maindone:2maindone:3maindone:4maindone:5maindone:6maindone:7maindone:8maindone:9maindone:10maindone:11maindone:12maindone:13maindone:14maindone:15maindone:16maindone:17done:8done:9done:10done:11done:12done:13done:14done:15done:16maindone:18maindone:19done:17done:18done:19

View Code

分析,

edf54f57eb7fa9763baa7d01bfed94fd.png

简单而言:

e3170ebb56d8403f917fcde32c915c5e.png

Thread累

9b9327c730ad5bb0833eb6a8c0890c62.png

获取线程名字1111

创建Thread子累:

public class MyThread extendsThread{

@Overridepublic voidrun() {

String ThreadName=getName();

System.out.println(ThreadName);

}

}

实例化:

public classDemo2Test {public static voidmain(String[] args) {

MyThread myThread= newMyThread();

myThread.start();

MyThread myThread2= newMyThread();

myThread2.start();

}

}/*Thread-0

Thread-1*/

获取线程名字2222

子类修改

public class MyThread extendsThread{

@Overridepublic voidrun() {//String ThreadName= getName();//System.out.println(ThreadName);//获取当前运行的线程,引用

Thread ct =Thread.currentThread();

System.out.println(ct);

System.out.println(ct.getName());

}

}

简化语句:链式编程

System.out.println(Thread.currentThread().getName());

结果:

Thread[Thread-0,5,main]

Thread-0Thread[Thread-1,5,main]

Thread-1

设置线程名称 setName

0aa72b50282cc75405cc86258b8f2e38.png

子类:

public class MyThread extendsThread{publicMyThread() {

}publicMyThread(String name) {super(name);

}

@Overridepublic voidrun() {

System.out.println(Thread.currentThread().getName());

}

}

public classDemo2Test {public static voidmain(String[] args) {

MyThread myThread= new MyThread("quan");

myThread.start();

MyThread myThread2= newMyThread();

myThread2.start();

}

}/*quan

Thread-0*/

线程睡眠方法:sleep

e66675d642fbd3634e1e80019bb8dd2d.png

静态方法,直接调用

public classDemo2Test {public static voidmain(String[] args) {for (int i = 1; i < 60; i++) {

System.out.println(i);try{

Thread.sleep(1000);

}catch(InterruptedException e) {

e.printStackTrace();

}

}

}

}

创建线程的第二种方式

94d0fccc869be8a34ff6a110158402fc.png

实现接口累,必须重载

packageThread;public class RunnableImpl implementsRunnable{

@Overridepublic voidrun() {for (int i = 0; i < 20; i++) {

System.out.println(Thread.currentThread().getName()+i);

}

}

}

public classDemo2Test {public static voidmain(String[] args) {

RunnableImpl runn= newRunnableImpl();//传入runnable对象

Thread td = newThread(runn);//掉用start方法

td.start();for (int i = 0; i < 20; i++) {

System.out.println(Thread.currentThread().getName()+i);

}

}

}/*main0

Thread-00

main1

Thread-01

Thread-02

Thread-03*/

继承Thread和实现Runnable接口的区别

130817ec81adfc6f4e9e1545b5408f31.png

我们可以按照不同的需求去将实现累修改,传入不同的实现类给Thread的构造方法就行

建议使用Runnable

fda022999e0a1225b19ecba35b38386e.png

使用匿名内部类方式实现线程的创建

13b283cc92ea358b96bd1408f2bb5360.png

public classDemoTest3 {public static voidmain(String[] args) {//匿名内部类,线程父类是Thread

newThread() {//重写run方法

@Overridepublic voidrun() {for (int i = 0; i < 20; i++) {

System.out.println(Thread.currentThread().getName()+ "---" +i);

}

}

}.start();//创建完子类调用start开启线程//匿名内部类,父类是Runnable接口//利用接口等于一个实现接口的类---多态

Runnable runn = newRunnable() {

@Overridepublic voidrun() {for (int i = 0; i < 20; i++) {

System.out.println(Thread.currentThread().getName()+ "---" +i);

}

}

};

Thread th= newThread(runn);

th.start();//或则:

new Thread(newRunnable() {

@Overridepublic voidrun() {for (int i = 0; i < 20; i++) {

System.out.println(Thread.currentThread().getName()+ "---" +i);

}

}

}).start();//再或者:lambda表达式

new Thread(()->{for (int i = 0; i < 20; i++) {

System.out.println(Thread.currentThread().getName()+ "---" +i);

}

}).start();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值