t1
не является потоком.
t1
- это экземпляр Thread
, но экземпляр Thread
- это не то же самое, что поток, и то, как вы используете t1
, поток никогда не создается. Думайте об экземпляре Thread
как о дескрипторе , который вы используете для создания потока и управления им. Поток будет создан, если ваша программа вызвала t1.start()
, а затем все вызовы t1.isAlive()
и t1.interrupt()
и t1.stop()
будут работать с этим новым потоком.
Помимо экземпляра Thread
, t1
также оказывается экземпляром Runnable
, что и требуется для вызова executer.execute(...)
. Наличие Runnable
просто означает, что t1
имеет метод run()
. Существует несколько способов вызова метода run()
:
- Вы можете запустить поток,
t1.start()
, и в этом случае новый поток вызовет его: - Вы могли (вы сделали ) передать его
Executor
. Когда вы это делаете, Executor принимает меры к тому, чтобы один из своих рабочих потоков вызывал ваш run()
метод. - Вы можете просто назвать его -
t1.run()
- что ничем не отличается от вызова любого другого метода, определяемого вашим кодом. - Вы можете передать его любому другому библиотечному методу, которому требуется
Runnable
. (Я не знаю, сколько их, может быть, много.)
Если вы хотите, чтобы t1.run()
вызывался в потоке, который может контролировать ваш код, тогда вызовите t1.start()
чтобы создать этот поток. Если вы хотите, чтобы он вызывал службу-исполнитель, потоки которой вы не должны пытаться контролировать, тогда сделайте то, что вы сделали: вызовите excuter.execute(t1);
Просто не делайте и то, и другое. Вероятно, это не то, что вам нужно.
PS. Если вы хотите продолжить использование службы Executor, вам, вероятно, следует изменить свое объявление t1
. Поскольку в этом случае это должно быть только Runnable
, вы можете написать:
Thread t1=new Runnable(()->{
...
});
Таким образом, люди, читающие ваш код, не будут чесать в затылке и удивляться, знаете ли вы, что делаете.