程序、进程、线程
package com.www.java01;
/**
* 多线程的创建,方式一:继承于Thread类
* 1.创建一个继承于Thread类的子类
* 2.重写Thread类的run()方法----将要执行的操作声明在run方法中
* 3.创建子类对象
* 4.调用start()方法
* 例子:遍历10000以内的偶数
* @author www
* @creat 2022-{MONTH}-{DAY}
*/
public class ThreadTest{
public static void main(String[] args) {
SubThread st = new SubThread();
//start:①启动当前线程②调用此线程的run()
//不能写st.run(),不报错,但这个不是多线程
//如果希望再启动一个线程,需要再创建一个新的对象
st.start();
//下列操作仍在主线程
for(int i = 0;i < 100;i++){
if(i % 2 ==0){
System.out.println(i + "*******main()*******");
}
}
}
}
class SubThread extends Thread{
@Override
public void run() {
for(int i = 0;i < 10000;i++){
if(i % 2 ==0){
System.out.println(i);
}
}
}
}
主程序中的for循环和线程子类中的run是同时进行的,部分输出结果如图
package com.www.java02;
/**
* 练习:创建两个分线程,一个遍历100以内的偶数,另一个遍历100以内的奇数
*
*
*
* @author www
* @creat 2022-{MONTH}-{DAY}
*/
public class ThreadDemo {
public static void main(String[] args) {
SubThread1 st1 = new SubThread1();
SubThread2 st2 = new SubThread2();
st1.start();
st2.start();
}
}
class SubThread1 extends Thread{
@Override
public void run() {
for(int i = 0;i < 100;i++){
if(i%2 == 0){
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
}
class SubThread2 extends Thread{
@Override
public void run() {
for(int i = 0;i < 100;i++){
if(i%2 != 0){
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
}
部分输出结果
对于只用一次的线程,还可以
package com.www.java01;
/**
* 测试Thread中常用方法
*1.start():启动当前线程,调用当前线程的run()
*2.run():通常需要重写Thread类中的此方法,将创建线程的执行操作声明在此方法中
*3.currentThread():静态方法,返回执行当前代码的线程
*4.getName():获取当前线程名字
*5.setName():设置当前线程名字
*
* @author www
* @creat 2022-{MONTH}-{DAY}
*/
public class ThreadMethodTest {
public static void main(String[] args) {
SubThread3 subThread3 = new SubThread3();
subThread3.setName("线程一");
subThread3.start();
//给主线程命名
Thread.currentThread().setName("主线程");
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
}
class SubThread3 extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
}
给线程命名也可以利用构造器
package com.www.java01;
/**
* 测试Thread中常用方法
*1.start():启动当前线程,调用当前线程的run()
*2.run():通常需要重写Thread类中的此方法,将创建线程的执行操作声明在此方法中
*3.currentThread():静态方法,返回执行当前代码的线程
*4.getName():获取当前线程名字
*5.setName():设置当前线程名字
*
* @author www
* @creat 2022-{MONTH}-{DAY}
*/
public class ThreadMethodTest {
public static void main(String[] args) {
SubThread3 subThread3 = new SubThread3("线程一");
//subThread3.setName("线程一");
subThread3.start();
//给主线程命名
Thread.currentThread().setName("主线程");
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
}
class SubThread3 extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
public SubThread3(String name){
super(name);
}
}
输出结果
package com.www.java01;
/**
* 测试Thread中常用方法
*1.start():启动当前线程,调用当前线程的run()
*2.run():通常需要重写Thread类中的此方法,将创建线程的执行操作声明在此方法中
*3.currentThread():静态方法,返回执行当前代码的线程
*4.getName():获取当前线程名字
*5.setName():设置当前线程名字
*6.yield():释放当前cpu执行权
*
* @author www
* @creat 2022-{MONTH}-{DAY}
*/
public class ThreadMethodTest {
public static void main(String[] args) {
SubThread3 subThread3 = new SubThread3("线程一");
//subThread3.setName("线程一");
subThread3.start();
//给主线程命名
Thread.currentThread().setName("主线程");
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
}
class SubThread3 extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
if(i % 10 ==0){
yield();
}
}
}
public SubThread3(String name){
super(name);
}
}
部分输出结果:在线程一10处,释放cpu执行权,这里切换到了主线程,但并不是一定切换的,有可能线程一释放之后,线程一再次分配到执行权,释放指的是当前释放,不决定下一次的分配
7.join():在线程a中调用线程b的join方法,线程a就进入阻塞状态,直到线程b完全执行完之后,线程a才结束阻塞状态
public class ThreadMethodTest {
public static void main(String[] args) {
SubThread3 subThread3 = new SubThread3("线程一");
//subThread3.setName("线程一");
subThread3.start();
//给主线程命名
Thread.currentThread().setName("主线程");
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
if(i == 20){
try {
subThread3.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class SubThread3 extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
// if(i % 10 ==0){
// yield();
// }
}
}
public SubThread3(String name){
super(name);
}
}
9.sleep(long millitime):让当前线程“睡眠”指定的毫秒数