A lot of this stuff is language specific, so I'll try to be as 'layman' and generic as possible.
They aren't necessarily definable in the sense you are using in the question. A Thread is sort of an instance of a procedure that executes concurrently with the rest of the program. They aren't opposites/compliments of each other.
A procedure, in this general sense, sounds like the term for a function, method, subroutine, etc. It is just a block of code that is logically separated, and can be called as needed.
A thread could just be an asynchronous call to a procedure, and it usually shares the same memory space as the calling thread.
Another way of putting it, you have your main thread, which executes from top to bottom, calling any procedures along the way. the called procedures/functions/methods etc are still part of the main thread. You can spawn a new thread for the operating system to manage, that has its own set of procedures/commands to execute but (generally) shares a memory space with the main (or calling) thread.