在网上也找了很多的资料进行学习,学习资料参差不齐,自己也在学习过程中总结了一些自己的内容,愿意记录自己的历程,同时分享出来,求指教。
一、在java中定义线程有两种方法。
(1)继承类Thread、
(2)使用接口Runnable
下面的例子来进行说明。
定义主方法ThreadDemo01
package com.linlin.thread;
/**
* 可以继承Thread类
* 或者使用接口runnable
*
* 此处将实现和调用分散在不同的java文件中
* @author
*
*状态包括:创建,就绪,执行,阻塞,终止
*/
public class ThreadDemo01 {
public static void main(String[] args) {
// 调用Thread类进行线程的实现
MyThread t1 = new MyThread("A");
MyThread t2 = new MyThread("B");
t1.run();
t2.run();
/**
* 线程的启动时是使用start() 方法。
*/
t1.start();
t2.start();
}
}
配合继承自Thread类的类MyThread进行线程实例的实现
package com.linlin.thread;
/**
* 使用thread类进行线程的创建
* @author
*
*/
public class MyThread extends Thread {
private String name;
public MyThread(String name) {
this.name = name;
}
@Override
public void run() {
super.run();
for (int j = 0; j < 100; j++) {
System.out.println(name +":" +j);
}
}
}
下面使用Runnable接口进行线程的实例实现的展示
package com.linlin.thread;
/**
* 可以继承Thread类
* 或者使用接口runnable
*
* 此处将实现和调用分散在不同的java文件中
* @author
*
*状态包括:创建,就绪,执行,阻塞,终止
*/
public class ThreadDemo01 {
public static void main(String[] args) {
// 此处使用Runnable接口进行线程的实现
MyRunnable r1 = new MyRunnable("A");
MyRunnable r2 = new MyRunnable("B");
/**
* 继承了Runnable接口的MyRunnable并没有启动线程的方法,所以还是需要使用Thread方法,并将r1,和r2作为参数传入
*/
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
}
使用了Runnable接口的MyRunnable类信息如下:
package com.linlin.thread;
public class MyRunnable implements Runnable{
private String name;
public MyRunnable(String name) {
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(name+":"+i);
}
}
}
二、在线程创建后使用getName() 方法获取当前线程的名字
package com.linlin.thread;
class Runnable1 implements Runnable{
private String name;
public Runnable1(String name) {
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(name+"当前的线程是:"+Thread.currentThread());
System.out.println("当前的线程名字是:"+Thread.currentThread().getName());
}
}
}
public class ThreadDemoGetName{
public static void main(String[] args) {
Runnable1 r1 = new Runnable1("A");
Thread t1 = new Thread(r1);
t1.start();
}
}
结果如下图:
三、使用join方法使一个线程强制执行,抢断cpu资源
package com.linlin.thread;
class RunnableDemo03 implements Runnable{
private String name;
public RunnableDemo03(String name) {
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println(name+":"+i);
}
}
}
public class ThreadDemoSleep {
public static void main(String[] args) {
RunnableDemo03 rd = new RunnableDemo03("A");
Thread t1 = new Thread(rd);
/**判断线程是否在执行,输出执行状态*/
System.out.println(t1.isAlive());
t1.start();
//t1.join()方法的使用。帮助我们进行强制执行我们的线程
for (int i = 0; i < 50; i++) {
if(i>10) {
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("主线程"+i);
}
System.out.println(t1.isAlive());
}
}
结果如图:
四、使用isAlive() 判断线程是否处于执行状态
package com.linlin.thread;
class RunnableDemo03 implements Runnable{
private String name;
public RunnableDemo03(String name) {
this.name = name;
}
@Override
public void run() {
}
}
public class ThreadDemoSleep {
public static void main(String[] args) {
RunnableDemo03 rd = new RunnableDemo03("A");
Thread t1 = new Thread(rd);
/**判断线程是否在执行,输出执行状态*/
System.out.println("线程是否在执行?---"+t1.isAlive());
t1.start();
System.out.println("线程是否在执行?---"+t1.isAlive());
}
}
判断线程是否处于执行状态的结果如下:
五、使用sleep使线程休眠,Thread.sleep(1000);表示睡眠时间为1秒钟
package com.linlin.thread;
class RunnableDemo03 implements Runnable{
private String name;
public RunnableDemo03(String name) {
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 50; i++) {
try {
//让线程睡眠,然后我们就让线程一秒钟执行一次
Thread.sleep(1000);
System.out.println(name+":"+i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class ThreadDemoSleep {
public static void main(String[] args) {
RunnableDemo03 rd = new RunnableDemo03("A");
Thread t1 = new Thread(rd);
t1.start();
}
}
使java程序中线程睡眠的程序测试结果如图:(数值间隔时间为1秒 -依次打印)
六、yield的方法,是使得我们得数值到达一个值之后,让出当前我们占领的cpu资源,之后由剩下的所有的线程进行资源的抢夺,首先获得资源的进行下一次的线程的执行与输出。
package com.linlin.thread;
class RunnableDemo04 implements Runnable{
private String name;
public RunnableDemo04(String name) {
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println(name+":"+i);
if (i == 10) {
System.out.println("礼让");
Thread.yield();
}
}
}
}
public class ThreadDemoYield {
public static void main(String[] args) {
RunnableDemo04 r1 = new RunnableDemo04("A");
RunnableDemo04 r2 = new RunnableDemo04("B");
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
}
第一次的结果截图:
第二次结果参考:
,在学习中自我感觉最重要的就是勤加练习,孰能生巧,单靠死记硬背是没有任何效果的,我们学习不只是为了一个饭碗,更重要的是可以实现从0到1的进步。
一起加油!祝你们学习顺利。